Что выведет код?
#Tasks
public class Task290525 {
public static void main(String[] args) {
System.out.println(1.0 / 0.0);
}
}
#Tasks
👍4
😱1
В предыдущей части мы рассмотрели составные части возникновения проблемы.
А теперь давайте рассмотрим, как решить данный кейс и как не попасть в подобную ловушку неочевидного поведения Hibernate.
Решения
Избегать fetch join при пагинации в Hibernate
Да так просто.
Но вы скажете: "А как же проблема N+1"? Ее я предлагаю решить всем известной аннотацией @BatchSize.
@Entity
public class User {
//стандартные поля
@OneToMany(mappedBy = "owner")
@BatchSize(size = 50)
private List<Car> cars = new ArrayList<>();
}
Количество запросов существенно уменьшится — на тот размер size, который мы задали. Это значит, что проблема N+1 решена.
Да, запросов станет точно больше чем 1. Но такова цена использования Spring Hibernate
разделение запроса на две части с использованием @EntityGraph
@EntityGraph(attributePaths = {"cars"})
Page<User> findAll(Pageable pageable);
При таком решении в первой части запроса мы запрашиваем id наших User с определенной страницы. А во второй части запроса с помощью @EntityGraph и JOIN мы получаем все Car которые им принадлежат.
Но как показали тестовые запуски с использованием @EntityGraph над множеством связанных сущностей в основной, проведенные автором статьи(спасибо ему) :
"При пяти загружаемых коллекциях производительность разделенного запроса с @EntityGraph хуже в 2 раза. При десяти — в 45 раз. А при загрузке 15 коллекций — в 1401 раз! На графике нет данных по разделенному запросу для 20 коллекций, так как я просто-напросто получил ошибку OutOfMemoryError."
С @BatchSize же никаких JOIN не происходит, и при добавлении дополнительной коллекции с ассоциацией @OneToMany просто добавляются дополнительные select для этой коллекции.
Использовать Нативный SQL - запрос.
Да, больше мороки с формированием динамического SQL (если у тебя 10 разных фильтров, ты сам будешь собирать SQL строку).
@Query(value = """
SELECT u.id AS userId, u.name AS userName, c.model AS carModel
FROM user u
LEFT JOIN car c ON c.owner_id = u.id
WHERE (:name IS NULL OR u.name ILIKE %:name%)
ORDER BY
CASE WHEN :sortBy = 'name' THEN u.name
WHEN :sortBy = 'id' THEN CAST(u.id AS TEXT)
ELSE u.name
END ASC
LIMIT :limit OFFSET :offset
""", nativeQuery = true)
List<UserCarDTO> findWithFilters(
@Param("name") String name,
@Param("sortBy") String sortBy,
@Param("limit") int limit,
@Param("offset") int offset
);
Да, придется использовать дополнительный count-запрос: SELECT COUNT(*) , для обеспечения пагинации
@Query(value = """
SELECT COUNT(DISTINCT u.id)
FROM user u
WHERE (:name IS NULL OR u.name ILIKE %:name%)
""", nativeQuery = true)
long countUsers(@Param("name") String name);
но, ты сам полностью управляешь процессом и скорее всего не встретишь неочевидного поведения
Какие ещё конструкции в JPA/Hibernate могут привести к аналогичным проблемам, когда ты используешь fetch join и неожиданно получаешь избыточную загрузку в память, ломающую пагинацию или вызывающую дублирование/нагрузку?
1. Pageable + @Query (с JPQL) и JOIN FETCH
Даже если ты не используешь Specification, а пишешь JPQL с @Query, проблема остаётся.
2. EntityManager + JPQL с fetch и пагинацией
Даже ручной вызов через EntityManager может привести к тому же эффекту.
3. Criteria API с fetch + .setMaxResults()/.setFirstResult()
Даже если ты используешь чистый JPA Criteria API, проблема может проявиться.
4. Spring Data REST + @RepositoryRestResource + fetch join
Если ты используешь Spring Data REST, и в репозитории включён fetch join, например через @Query, то Spring сам применяет Pageable, и может попасть в эту ловушку. Опять же — всё сломается.
И личный совет: изучайте матчасть! Читайте наш канал и шанс, что Ваш прод упадет - существенно снизится!
Понравился стиль подачи материала?
Отправь другу и ставь - 🔥
#Java #fetch #autor
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6
Чем отличается HashSet от TreeSet? 🤓
Ответ:
HashSet хранит элементы в хэш-таблице, не упорядочивает их, но работает быстрее (O(1) для добавления/поиска).
TreeSet хранит элементы в
отсортированном виде (на основе красно-черного дерева), но операции медленнее (O(log n)).
#собеседование
Ответ:
TreeSet хранит элементы в
отсортированном виде (на основе красно-черного дерева), но операции медленнее (O(log n)).
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
А вы знали, что первый "онлайн-банк" появился в 1995 году?
Security First Network Bank (SFNB), запущенный в 1995 году, был первым банком, предоставляющим услуги через интернет. Однако он потерпел неудачу из-за низкого доверия к подобным сервисам со стороны клиентов, которые были не готовы к таким инновациям. Другие ранние попытки создания онлайн-банкинга, такие как Chemical Bank и Chase Manhattan Bank, также показывали ограниченный успех, но заложили основу для последующего развития онлайн-банкинга. Позже другие банки, такие как Bank of America, стали успешными в этой области, что привело к широко распространенному внедрению онлайн-банкинга.
Proof
#facts
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
"Социальные сети — это не технология, это психология."
Крис Сакка, инвестор Twitter, сказал это в 2010 году на конференции TechCrunch.
Почитать короткую биографию
#Citation #Biography
Please open Telegram to view this post
VIEW IN TELEGRAM
Дзен | Статьи
Крис Сакка: юрист, инвестор, ковбой
Статья автора «Gem Space Media» в Дзене ✍: Биография Кристофера Сакки – инвестора Twitter и Uber
👍1
Глубокое изучение типа данных char в Java
Тип char в Java — это единственный примитивный тип, предназначенный для хранения символов. Однако под «символом» в контексте Java подразумевается не просто буква или цифра, а 16-битное значение, соответствующее одному коду Unicode. Это делает char более универсальным, чем аналогичные типы в других языках (например, char в C/C++ — это просто байт).
Тем не менее, с учетом особенностей кодировки Unicode, поведения в выражениях и сравнении с другими примитивами, char — не такой уж простой тип.
Что представляет собой char
В Java char — это целое беззнаковое значение, хранящееся в 16 битах (2 байта). Диапазон значений — от 0 до 65 535. Это соответствует возможным значениям Unicode Code Units, используемым для представления символов в кодировке UTF-16.
В отличие от byte, short, int и других числовых типов, char:
Не поддерживает отрицательные значения.
Не используется в арифметике напрямую (но может быть преобразован в int).
Представляет не число, а код символа, хотя технически это просто целое значение.
Хранение в памяти
Как и все примитивные типы, char хранится в стеке, если используется как локальная переменная, и в куче — если является полем объекта. В обоих случаях он занимает ровно 2 байта (16 бит).
Символ и кодировка Unicode
Java изначально проектировалась с поддержкой международного текста, поэтому char хранит значение по спецификации Unicode. Однако важно понимать: char хранит одну кодовую единицу UTF-16, а не обязательно один графический символ.
Некоторые символы Unicode (например, эмодзи или древние алфавиты) имеют коды за пределами 16 бит. Такие символы представлены в UTF-16 двумя char, известными как суррогатная пара.
Это значит, что один char — это не всегда "один символ", что может привести к ошибкам при разборе строк, итерации по символам или определении длины строки.
Пример:
Экранирование символов
Литералы char записываются в одиночных кавычках:
Java поддерживает экранированные символы, например:
'\n' — перевод строки
'\t' — табуляция
'\'' — апостроф
'\\' — обратный слеш
'\u0041' — Unicode-последовательность (в данном случае это символ 'A')
Unicode-последовательности (\uXXXX) можно использовать даже в имени переменной или в коде, до начала компиляции — они обрабатываются на уровне лексического анализатора, еще до построения синтаксического дерева.
#Java #для_новичков #beginner #char
Тип char в Java — это единственный примитивный тип, предназначенный для хранения символов. Однако под «символом» в контексте Java подразумевается не просто буква или цифра, а 16-битное значение, соответствующее одному коду Unicode. Это делает char более универсальным, чем аналогичные типы в других языках (например, char в C/C++ — это просто байт).
Тем не менее, с учетом особенностей кодировки Unicode, поведения в выражениях и сравнении с другими примитивами, char — не такой уж простой тип.
Что представляет собой char
В Java char — это целое беззнаковое значение, хранящееся в 16 битах (2 байта). Диапазон значений — от 0 до 65 535. Это соответствует возможным значениям Unicode Code Units, используемым для представления символов в кодировке UTF-16.
В отличие от byte, short, int и других числовых типов, char:
Не поддерживает отрицательные значения.
Не используется в арифметике напрямую (но может быть преобразован в int).
Представляет не число, а код символа, хотя технически это просто целое значение.
Хранение в памяти
Как и все примитивные типы, char хранится в стеке, если используется как локальная переменная, и в куче — если является полем объекта. В обоих случаях он занимает ровно 2 байта (16 бит).
Символ и кодировка Unicode
Java изначально проектировалась с поддержкой международного текста, поэтому char хранит значение по спецификации Unicode. Однако важно понимать: char хранит одну кодовую единицу UTF-16, а не обязательно один графический символ.
Некоторые символы Unicode (например, эмодзи или древние алфавиты) имеют коды за пределами 16 бит. Такие символы представлены в UTF-16 двумя char, известными как суррогатная пара.
Это значит, что один char — это не всегда "один символ", что может привести к ошибкам при разборе строк, итерации по символам или определении длины строки.
Пример:
String s = "😀";
System.out.println(s.length()); // 2, а не 1
Здесь length() возвращает 2, потому что символ представлен двумя char.
Экранирование символов
Литералы char записываются в одиночных кавычках:
char c = 'A';
Java поддерживает экранированные символы, например:
'\n' — перевод строки
'\t' — табуляция
'\'' — апостроф
'\\' — обратный слеш
'\u0041' — Unicode-последовательность (в данном случае это символ 'A')
Unicode-последовательности (\uXXXX) можно использовать даже в имени переменной или в коде, до начала компиляции — они обрабатываются на уровне лексического анализатора, еще до построения синтаксического дерева.
#Java #для_новичков #beginner #char
👍3
Поведение в выражениях и преобразования
Несмотря на то, что char — это не числовой тип, он может участвовать в арифметике. В любых выражениях с участием char он неявно преобразуется в int.
Но обратное требует явного приведения:
Сравнение с другими примитивными типами
В отличие от byte, short, int, char — беззнаковый.
Он занимает 2 байта, как short, но short — знаковый (-32 768 до 32 767), а char — 0 до 65 535.
В арифметике char ведет себя как int, автоматически повышая тип.
В отличие от String, char представляет одну кодовую единицу, а не последовательность символов.
В отличие от boolean, char может участвовать в арифметических выражениях и преобразованиях.
Инициализация и значения по умолчанию
Локальные переменные char должны быть явно инициализированы.
Поля классов по умолчанию получают значение \u0000, что соответствует нулевому символу Unicode (не отображается в консоли).
Частые ошибки и подводные камни
Суррогатные пары. При работе со строками, содержащими символы за пределами BMP (Basic Multilingual Plane), важно использовать методы вроде codePointAt() и Character.toChars(), чтобы не потерять часть символа.
Арифметика с char. Все выражения приводятся к int, что может привести к неожиданному переполнению или необходимости явного приведения.
Сравнение символов. Операции c1 < c2 работают корректно, но сравниваются числовые значения Unicode, а не "лексикографическое положение" в каком-либо языке.
Обработка управляющих символов. Символы вроде '\0', '\n', '\r' видны в коде, но не обязательно видны в выводе — их эффект зависит от среды (консоль, IDE, файл и т.д.).
#Java #для_новичков #beginner #char
Несмотря на то, что char — это не числовой тип, он может участвовать в арифметике. В любых выражениях с участием char он неявно преобразуется в int.
char c = 'A';
int x = c + 1; // x == 66
Но обратное требует явного приведения:
char next = (char)(c + 1); // 'B'
Аналогично, попытка присвоить результат арифметики напрямую переменной типа char вызовет ошибку компиляции без приведения.
Сравнение с другими примитивными типами
В отличие от byte, short, int, char — беззнаковый.
Он занимает 2 байта, как short, но short — знаковый (-32 768 до 32 767), а char — 0 до 65 535.
В арифметике char ведет себя как int, автоматически повышая тип.
В отличие от String, char представляет одну кодовую единицу, а не последовательность символов.
В отличие от boolean, char может участвовать в арифметических выражениях и преобразованиях.
Инициализация и значения по умолчанию
Локальные переменные char должны быть явно инициализированы.
Поля классов по умолчанию получают значение \u0000, что соответствует нулевому символу Unicode (не отображается в консоли).
Частые ошибки и подводные камни
Суррогатные пары. При работе со строками, содержащими символы за пределами BMP (Basic Multilingual Plane), важно использовать методы вроде codePointAt() и Character.toChars(), чтобы не потерять часть символа.
Арифметика с char. Все выражения приводятся к int, что может привести к неожиданному переполнению или необходимости явного приведения.
Сравнение символов. Операции c1 < c2 работают корректно, но сравниваются числовые значения Unicode, а не "лексикографическое положение" в каком-либо языке.
Обработка управляющих символов. Символы вроде '\0', '\n', '\r' видны в коде, но не обязательно видны в выводе — их эффект зависит от среды (консоль, IDE, файл и т.д.).
#Java #для_новичков #beginner #char
👍2
Что выведет код?
#Tasks
public class Task300525 {
public static void main(String[] args) {
char c = 'A';
c += 1.5;
System.out.println(c);
}
}
#Tasks
👍1
👍2
Продолжаем выбирать темы для разбора и голосовать за рассмотрение предложенных! 🤓
Голосуем за тему к рассмотрению в эти выходные!
Выбираем новую тему!
(можете предложить что-то из того что предлагали на прошлой неделе и что проигрывает в голосовании!)
Не стесняемся!✌️
Голосуем за тему к рассмотрению в эти выходные!
Выбираем новую тему!
(можете предложить что-то из того что предлагали на прошлой неделе и что проигрывает в голосовании!)
Не стесняемся!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
В чем разница между throw и throws? 🤓
Ответ:
throw используется для явного выброса исключения, например: throw new IOException();.
throws указывается в сигнатуре метода, чтобы сообщить, какие проверяемые исключения он может выбросить, например: void method() throws IOException.
#собеседование
Ответ:
throws указывается в сигнатуре метода, чтобы сообщить, какие проверяемые исключения он может выбросить, например: void method() throws IOException.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
С 24.05 по 31.05
Предыдущий пост(с 17.05 по 23.05)
Следующая неделя
Воскресный мотивационный пост:
"Твой первый проект — важнее, чем думаешь"
Выбранная голосованием тема:
Паттерны проектирования на Java: суть, история и применение
Запись встреч:
Изучаем Swagger
Обучающие статьи:
Глубокое изучение типа данных double в Java
Глубокое изучение типа float в Java
Глубокое изучение типа данных char в Java
Введение в Liquibase
Структура и основные команды Liquibase
Пост под которым нет поздравлений:
Сегодня каналу исполнился год!🥳
Авторские статьи:
Как я память искал (Часть I)
Как я память искал (Часть II)
Полезные статьи и видео:
Управление транзакциями в Spring: подробно о @Transactional
Делаем свою простейшую систему сборки для Java
Проблема N+1 в Hibernate — ВСЕ СПОСОБЫ решения
Как и всегда, задачи можно найти под тегом - #Tasks, вопросы с собеседований - #собеседование
#memory
Предыдущий пост(с 17.05 по 23.05)
Следующая неделя
Воскресный мотивационный пост:
"Твой первый проект — важнее, чем думаешь"
Выбранная голосованием тема:
Паттерны проектирования на Java: суть, история и применение
Запись встреч:
Изучаем Swagger
Обучающие статьи:
Глубокое изучение типа данных double в Java
Глубокое изучение типа float в Java
Глубокое изучение типа данных char в Java
Введение в Liquibase
Структура и основные команды Liquibase
Пост под которым нет поздравлений:
Сегодня каналу исполнился год!
Авторские статьи:
Как я память искал (Часть I)
Как я память искал (Часть II)
Полезные статьи и видео:
Управление транзакциями в Spring: подробно о @Transactional
Делаем свою простейшую систему сборки для Java
Проблема N+1 в Hibernate — ВСЕ СПОСОБЫ решения
Как и всегда, задачи можно найти под тегом - #Tasks, вопросы с собеседований - #собеседование
#memory
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
После проведенного голосования, определилась тема для рассмотрения в выходные - MVC.
Приступим'с
Архитектурный шаблон MVC в Java Spring: теория, правила, ошибки
MVC (Model–View–Controller) — это один из фундаментальных архитектурных паттернов в программной инженерии, направленный на разделение приложения на логически независимые компоненты. Его основная цель — изолировать пользовательский интерфейс от бизнес-логики и доступа к данным. В экосистеме Java фреймворк Spring реализует этот шаблон через модуль Spring MVC.
Теория: что такое MVC
Шаблон MVC подразумевает разделение приложения на три слоя:
Model (Модель)
Модель инкапсулирует бизнес-логику и данные приложения. Она может включать:
Сущности базы данных (например, классы с аннотацией @Entity).
Репозитории (@Repository), обеспечивающие доступ к данным.
Сервисный слой (@Service), реализующий бизнес-логику.
DTO (Data Transfer Objects) — объекты для обмена данными между слоями.
View (Представление)
Представление отвечает за отображение информации пользователю. В Spring это обычно:
HTML-шаблоны (например, на Thymeleaf).
JSON-ответы (в случае REST API).
Альтернативные форматы (XML, PDF и пр.).
View должен быть как можно более простым и не содержать бизнес-логики.
Controller (Контроллер)
Контроллер — связующее звено между внешним миром (HTTP-запросами) и внутренними слоями приложения. Он:
Принимает входные данные.
Делегирует выполнение модели.
Выбирает и возвращает подходящее представление.
Контроллеры в Spring создаются с помощью аннотаций @Controller или @RestController.
Жизненный цикл HTTP-запроса в Spring MVC
Роль слоёв в приложении Spring
Контроллер
Контроллер должен быть «тонким» и не содержать бизнес-логики. Его задача — маршрутизировать запросы и собирать данные, необходимые представлению.
Пример (корректный):
@GetMapping("/users")
public List<UserDto> getUsers(Model model) {
return userService.getAllUsers();
}
Неправильный пример (контроллер содержит логику):
@GetMapping("/users")
public List<UserDto> getUsers(Model model) {
List<User> users = userRepository.findAll();
return users.stream()
.map(user -> new UserDto(user.getId(), user.getName()))
.collect(Collectors.toList());
}
Сервисный слой
Сервисный слой содержит бизнес-логику, правила обработки данных, валидацию, логи, обработку ошибок. Он изолирован от HTTP и представления. Сервисы не должны напрямую зависеть от Model, HttpServletRequest или аннотаций Spring MVC.
Пример:
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public List<UserDto> getAllUsers() {
return userRepository.findAll().stream()
.map(user -> new UserDto(user.getId(), user.getName()))
.collect(Collectors.toList());
}
}
Репозиторий
Репозиторий отвечает за доступ к данным. Он инкапсулирует работу с базой и предоставляет CRUD-интерфейс.
public interface UserRepository extends JpaRepository<User, Long> {}
#Java #для_новичков #beginner #on_request #mvc
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Распространённые ошибки
1. Логика в контроллерах
Признак: контроллер становится "сервисом", содержащим условия, циклы, доступ к БД. Это нарушает принципы чистой архитектуры и усложняет тестирование.
2. Использование Entity в представлении
Передача @Entity напрямую в шаблон может привести к:
Утечке данных (например, паролей).
Ошибкам LazyInitializationException.
Сильной связанности представления с базой данных.
Решение: использовать DTO или ViewModel.
3. Жёсткая связность между слоями
View не должно зависеть от Repository, а Controller — от Entity. Каждый слой должен взаимодействовать только с соседним.
4. Отсутствие DTO
Использование одной и той же модели во всех сценариях ведёт к путанице и проблемам безопасности. Лучше использовать отдельные классы:
UserCreateRequest
UserResponse
UserUpdateRequest
Рекомендации по проектированию
Структура проекта
Хорошей практикой является разделение кода по слоям:
URL-дизайн
Соблюдайте RESTful-стиль:
GET /users — получить список пользователей.
GET /users/{id} — получить конкретного пользователя.
POST /users — создать.
PUT /users/{id} — обновить.
DELETE /users/{id} — удалить.
Использование DTO
Расширения и адаптации MVC
SPA + API
При использовании Vue, React или Angular, представление полностью переносится на фронтенд. В этом случае Spring работает как REST API с @RestController, и классическая схема MVC трансформируется в «REST + JSON».
Поддержка реактивности
Spring WebFlux реализует неблокирующую модель с Mono и Flux, сохраняя при этом логическую структуру MVC. Подходит для высоконагруженных и асинхронных приложений.
Тестирование компонентов MVC
Контроллеры — @WebMvcTest, MockMvc.
Сервисы — @SpringBootTest или с моками (@MockBean).
Репозитории — @DataJpaTest.
#Java #для_новичков #beginner #on_request #mvc
1. Логика в контроллерах
Признак: контроллер становится "сервисом", содержащим условия, циклы, доступ к БД. Это нарушает принципы чистой архитектуры и усложняет тестирование.
2. Использование Entity в представлении
Передача @Entity напрямую в шаблон может привести к:
Утечке данных (например, паролей).
Ошибкам LazyInitializationException.
Сильной связанности представления с базой данных.
Решение: использовать DTO или ViewModel.
3. Жёсткая связность между слоями
View не должно зависеть от Repository, а Controller — от Entity. Каждый слой должен взаимодействовать только с соседним.
4. Отсутствие DTO
Использование одной и той же модели во всех сценариях ведёт к путанице и проблемам безопасности. Лучше использовать отдельные классы:
UserCreateRequest
UserResponse
UserUpdateRequest
Рекомендации по проектированию
Структура проекта
Хорошей практикой является разделение кода по слоям:
com.example.myapp
├── controller
├── service
│ └── impl
├── repository
├── dto
├── model
├── config
URL-дизайн
Соблюдайте RESTful-стиль:
GET /users — получить список пользователей.
GET /users/{id} — получить конкретного пользователя.
POST /users — создать.
PUT /users/{id} — обновить.
DELETE /users/{id} — удалить.
Использование DTO
public class UserResponse {
private Long id;
private String name;
}
public class UserCreateRequest {
private String name;
private String email;
}
Расширения и адаптации MVC
SPA + API
При использовании Vue, React или Angular, представление полностью переносится на фронтенд. В этом случае Spring работает как REST API с @RestController, и классическая схема MVC трансформируется в «REST + JSON».
Поддержка реактивности
Spring WebFlux реализует неблокирующую модель с Mono и Flux, сохраняя при этом логическую структуру MVC. Подходит для высоконагруженных и асинхронных приложений.
Тестирование компонентов MVC
Контроллеры — @WebMvcTest, MockMvc.
Сервисы — @SpringBootTest или с моками (@MockBean).
Репозитории — @DataJpaTest.
#Java #для_новичков #beginner #on_request #mvc
👍5
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Есть предложение встретиться завтра в 16:00 по МСК на лайвкодинг!
Тема будет: Многопоточка на примерах
Тема будет: Многопоточка на примерах
Anonymous Poll
33%
О, интересно, я приду ✈️
27%
Блииин, я хочу, но нет возможности 🤷♀️
39%
Посмотрю в записи 👌
0%
Не приду. Фигню какую то рассматриваете 🤢
👍2
Всем привет! ✌️
Приглашаю всех желающих сегодня собраться в Яндекс.Телемост в 16:00 по МСК!
В этот раз, @rKiraLis39 расскажет и покажет много интересного по многопоточке.
И даже если раньше вы все это знали, лишним повторить не будет.
Приходите, это хороший шанс позадавать вопросы🧑💻
Как всегда жду всех! 🫡
Приглашаю всех желающих сегодня собраться в Яндекс.Телемост в 16:00 по МСК!
В этот раз, @rKiraLis39 расскажет и покажет много интересного по многопоточке.
И даже если раньше вы все это знали, лишним повторить не будет.
Приходите, это хороший шанс позадавать вопросы
Как всегда жду всех! 🫡
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
«Ты не программируешь — ты притворяешься, что учишься»
Однажды я купил себе книгу Spring 5.
Большая, толстая, со множеством, страниц. Неся её домой я живо представлял себе, что уже завтра буду писать Spring-приложения, направо и налево.🥳
И я честно прочитал ее. А потом еще разок.🤓
И ПОНЯЛ, ЧТО НИЧЕГО НЕ ПОНЯЛ!
Точнее понять то понял (книга ж на русском🤪 ), да вот открыв IDEA яснее мне ничего не стало.
Как это начать писать то?😔
И вот тут, друзья, скрывается одна из потаённых реальностей обучения:
🚨 Пойми:
🔵 Купить и прочитать хорошие книги ≠ уметь программировать.
🔵 Смотреть популярные видео с каналов по программированию ≠ учить Java.
🔵 Количество открытых вкладок в браузере с умными статьями ≠ умный ты.
🔵 Пока ты изображаешь, другие сдают тестовые и получают офферы.
🔵 Месяц «обучения без практики» = 0% роста = потерянное время.
✔️ Поэтому прямо сейчас:
➡️ Закрой вкладку с курсами. Открой IDE. 🧑💻
➡️ Придумай и напиши что-то ужасное. (И пусть оно не работает. Но ты хотя бы начал). 😈
➡️ И да, будет больно. Будет стыдно (если никому не показывать, то не очень - только перед собой)😭
➡️ Но это единственный путь, на котором ты реально сдвинешься с мёртвой точки. 💪
А я, все таки победил Spring.
Правда потом, книгу почти не открывал, только для уточнения совсем уж непонятных деталей.
Просто, после написания очередного таск-менеджера, незнакомых аннотаций как будто не осталось, пришло понимание, как работает тот или иной метод, исчез страх "что-то сделать не так".
Поэтому
Просто
Начни
ПИСАТЬ КОД
😎
#motivation
Однажды я купил себе книгу Spring 5.
Большая, толстая, со множеством, страниц. Неся её домой я живо представлял себе, что уже завтра буду писать Spring-приложения, направо и налево.
И я честно прочитал ее. А потом еще разок.
И ПОНЯЛ, ЧТО НИЧЕГО НЕ ПОНЯЛ!
Точнее понять то понял (книга ж на русском
Как это начать писать то?
И вот тут, друзья, скрывается одна из потаённых реальностей обучения:
99% "учеников" не учатся. Они просто создают иллюзию прогресса: читают, смотрят, копят курсы — но не пишут код.
Пока ты не сел и не написал — ты не учишься.
Тебе приятно, когда ты "в теме" — но это ложное ощущение движения.
Чтение статей создаёт видимость прогресса, но мозг это не фиксирует как навык.
Для тебя это должна быть не мотивация, а ультиматум: начни делать или отойди в сторону.
Притворяться — удобно. Но дорого
А я, все таки победил Spring.
Правда потом, книгу почти не открывал, только для уточнения совсем уж непонятных деталей.
Просто, после написания очередного таск-менеджера, незнакомых аннотаций как будто не осталось, пришло понимание, как работает тот или иной метод, исчез страх "что-то сделать не так".
Поэтому
Просто
Начни
ПИСАТЬ КОД
#motivation
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍1 1
Предлагаем темы для разбора и публикации! 📖
В комментариях к данному посту предлагайте вопросы, которые вы хотели бы увидеть максимально подробно разобранными в постах, а если будет интересно то и на видео.
Голосование будет проводиться всю неделю, а статья или видео - выходить по выходным.
Примерные правила:
🟢 темы, не выше уровня middle, чтоб был интерес общим.
🟢 один человек - одна тема.
🟢 Тема должна быть отдельным теоретически-практическим вопросом. Готовый проект - это не тема!
Жду Ваших предложений!👏
В комментариях к данному посту предлагайте вопросы, которые вы хотели бы увидеть максимально подробно разобранными в постах, а если будет интересно то и на видео.
Голосование будет проводиться всю неделю, а статья или видео - выходить по выходным.
Примерные правила:
Жду Ваших предложений!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Выбираем темы предложенные на этой неделе!
Anonymous Poll
31%
JavaMailSender
14%
AOP
20%
IO/NIO
20%
Maven
14%
JSON
👍3