Java for Beginner
717 subscribers
660 photos
174 videos
12 files
1.03K links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Сломай свой хаос 😵‍💫

Ты начал работать на удалёнке.
Никто не говорит тебе, когда начинать.
Хочешь — работай днём, хочешь — ночью. Важен только результат.

Звучит как мечта, да?


На самом деле — это ловушка.
Потому что без самоорганизации ты быстро превратишься в зомби, который "делает вид, что работает", а внутри тонет в хаосе.


"Можно быть умным, талантливым, даже иметь опыт.
Но без умения строить свой день и держать ритм — в долгую ты не вытянешь."



🤫 Самообучение смертельно опасно, если заниматься этим беспорядочно

Курсы, видео, статьи, pet-проекты.
Сотни вкладок, 5 начатых репозиториев, ни одного завершённого.
Кажется, что ты в процессе… но на самом деле ты в болоте.

В психологии это состояние называют cognitive overload — когнитивная перегрузка.
(Sweller, J., Ayres, P., & Kalyuga, S. (2011). Cognitive Load Theory)

Ты берёшь на себя больше информации, чем способен обработать, и эффективность падает до нуля.


В IT это смертельно. Технологии бегут вперёд, а ты всё ещё бродишь по курсу «Java для начинающих» третий месяц без прогресса.



😞 Почему хаос убивает продуктивность

Нет границ
Удалёнка или самообучение = никто не скажет «стоп». В итоге либо работаешь до трёх ночи, либо растягиваешь одну задачу на весь день.

Потеря приоритетов
Вместо реальных задач ковыряешь шрифты в IDE, читаешь про новый фреймворк "на всякий случай". Это называется procrastination through busyness — прокрастинация через псевдозанятость.
(Pychyl, T. A., & Sirois, F. M. (2013). Procrastination, emotion regulation, and well-being)

Отсутствие ритма
Мозг — не хаотичная машина. Ему нужны циклы активности и отдыха (circadian rhythm). Без них ты превращаешься в сонного, раздражённого, медленного кодера.


‼️ Что же делать ‼️

😑 Разбивай путь на малые шаги. Строй планы, декомпозируй их на малые таски и стремись их выполнить.
И четко придерживайся плана. Чем точнее ты выполнишь задачу, уложившись в отведенное время, тем проще будет следующая.
Декомпозиция и обязательность - тоже навыки. Их тоже можно прокачать. Не пренебрегай ими.



🤨 Стань себе начальником. Заставь себя. Выстрели в свою лень.
Ставь задачи в календарь с точным временем.
Не что-то в голове, на уровне идей, а конкретика: в 19:00–20:30 — пишу код для pet-проекта.

И это время не двигается. Совсем.


😏 Одна задача = один фокус. Концентрация прокачивается. Строй вокруг себя условия, чтобы она не сбивалась.
Single-tasking — продуктивность падает, если переключаться между задачами.
Закрываешь IDE, чтобы на секундочку проверить почту - потерял 20–30% концентрации.
Делай одно дело за раз.



😐 Убери "проблему первого шага".
Хочешь учиться?

Сделай так, чтобы:
IDE уже была открыта
Курс уже загружен
Репозиторий уже клонирован

Это называется reducing activation energy — чем меньше действий до старта, тем выше шанс, что ты реально начнёшь.
(Oettingen, G., & Gollwitzer, P. M. (2010). Strategies of setting and implementing goals: Mental contrasting and implementation intentions. In Social Psychological Foundations of Clinical Psychology)


🤔 Почему это важно для айтишника

В офисе тебя могут спасать менеджеры, график, коллеги, которые напоминают о дедлайнах.
На удалёнке или при самообучении у тебя есть только Ты.

И если ты сам себе не начальник — значит, ты сам себе враг.

Самоорганизация — это не про мотивацию, а про систему. Мотивация придет позже.
Система = привычки, которые работают даже в дни, когда ты не хочешь работать.


Если не начнёшь ломать хаос сегодня — завтра он сломает тебя.

Поэтому, запланируй ответить мне в комментариях, что ты думаешь об это статье! Прокачай навык 😉


Понравилась статья - поделись с другом, позови его на канал и будет тебе моя благодарность 🤝

😎

#motivation
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥31
📌 Факт дня:

А вы знали, что термин "девопс" был придуман в 2009 году?

Слово "DevOps" (Development + Operations) ввёл Патрик Дебуа для описания методологии, объединяющей разработку и эксплуатацию ПО. Сегодня это стандарт для IT-команд.

proof

#facts
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
ℹ️ Кто родился в этот день

Генна́дий Фёдорович Филаре́тов (род. 4 августа 1938, Москва).
Советский и российский учёный в области вычислительной техники, специалист по цифровому анализу сигналов и нейросетям, участвовал в разработке систем автоматики и информационных технологий.

Пётр Дми́триевич Зе́гжда (4 августа 1940, Соликамск — 12 февраля 2022, Санкт-Петербург).
Российский учёный и профессор СПбПУ, один из основателей учебной кафедры «Информационная безопасность компьютерных систем», разработчик методов и систем защиты информации.

Фрэнсис Элизабет Аллен (англ. Frances Elizabeth Allen; 4 августа 1932 года, штат Нью-Йорк — 4 августа 2020)
.
Американский учёный в области теории вычислительных систем, первая женщина – лауреат премии Тьюринга (2006).

#Biography #Birth_Date
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Модульность и многомодульные проекты в Gradle

Gradle поддерживает многомодульные проекты, позволяя организовать проект в виде иерархии подмодулей, каждый из которых имеет собственный build.gradle или build.gradle.kts. Это обеспечивает модульность, разделение ответственности и повторное использование кода.

Преимущества:
Разделение функциональности на независимые модули (например, API, ядро, реализация).
Упрощение тестирования и поддержки.
Параллельная сборка модулей для повышения производительности.
Повторное использование конфигураций и зависимостей.


В памяти: Каждый модуль создает собственный объект Project в модели Gradle, увеличивая потребление памяти пропорционально количеству модулей (обычно 50-100 МБ на модуль). Граф задач (DAG) для всех модулей хранится в памяти, что может достигать 1-2 ГБ для крупных проектов.


settings.gradle(.kts) — управление include-проектами
Файл settings.gradle (или settings.gradle.kts) определяет структуру многомодульного проекта, включая корневое имя и подмодули.

Основные функции:
Указание имени корневого проекта: rootProject.name.
Включение подмодулей через include.
Настройка репозиториев и плагинов через pluginManagement.


Пример (Groovy DSL):
rootProject.name = 'my-project'
include 'module-api', 'module-core', 'module-web'


Kotlin DSL:
rootProject.name = "my-project"
include("module-api", "module-core", "module-web")


Нюансы:
Каждый подмодуль должен иметь собственный build.gradle в папке с таким же именем (например, module-api/build.gradle).
Подмодули могут быть вложенными:include 'module-core:submodule'


В памяти: settings.gradle загружается на фазе инициализации, создавая модель проекта с объектами Project для каждого модуля. Это минимальная фаза по потреблению памяти (50-100 МБ), но сложные настройки (например, pluginManagement) могут увеличить overhead.



Структура multi-module проекта: Parent + Children

Многомодульный проект состоит из корневого (parent) проекта и подмодулей (children), каждый из которых имеет собственный build.gradle.

Пример структуры:
my-project/
├── build.gradle
├── settings.gradle
├── module-api/
│ └── build.gradle
├── module-core/
│ └── build.gradle
├── module-web/
│ └── build.gradle


Parent проект:

Корневой build.gradle задает общие настройки, плагины и зависимости для всех подмодулей.

Пример:
allprojects {
repositories {
mavenCentral()
}
}
subprojects {
apply plugin: 'java'
dependencies {
testImplementation 'junit:junit:4.13.2'
}
}


Children проекты:
Каждый подмодуль имеет собственный build.gradle, определяющий специфические задачи, зависимости и конфигурации.

Пример (module-api/build.gradle):
plugins {
id 'java-library'
}
dependencies {
api 'org.apache.commons:commons-lang3:3.12.0'
}


В памяти: Корневой проект загружает модель для всех подмодулей, включая их задачи и зависимости. Каждый подмодуль добавляет объект Project и граф задач, увеличивая потребление памяти.

Для оптимизации используйте --configure-on-demand:
./gradlew build --configure-on-demand


Project Access: project(":module")

Подмодули доступны через объект project с использованием их пути, определенного в settings.gradle.

Пример:
dependencies {
implementation project(':module-core')
}

Это добавляет module-core как зависимость для текущего модуля.

Нюансы:
Путь начинается с : для корневого проекта (например, :module-core:submodule для вложенных модулей).
Доступ к свойствам другого модуля:println project(':module-core').version


В памяти: Gradle хранит все объекты Project в памяти, обеспечивая доступ через project(). Это увеличивает модель проекта, особенно для больших иерархий модулей.


#Java #middle #Gradle #Task #include_projects
👍2
Sharing Logic между проектами

Совместное использование логики между модулями повышает повторное использование кода и упрощает поддержку.

Common Logic

В корневом build.gradle:
Используйте блоки allprojects и subprojects для общих настроек:
subprojects {
apply plugin: 'java'
version = '1.0.0'
repositories {
mavenCentral()
}
}


Скриптовые плагины:

Создайте файл common.gradle:

apply plugin: 'java'
dependencies {
testImplementation 'junit:junit:4.13.2'
}


Подключите в подмодулях:
apply from: "$rootDir/gradle/common.gradle"


Кастомные плагины:
Создайте плагин для общей логики (см. раздел "Создание собственных плагинов" в предыдущей статье).

Пример применения:
subprojects {
apply plugin: 'com.example.common-plugin'
}

В памяти: Общая логика уменьшает дублирование кода, но увеличивает сложность модели проекта, так как Gradle загружает и парсит дополнительные скрипты или плагины.



Version Catalogs (libs.versions.toml)

Version Catalogs — это централизованный способ управления версиями зависимостей и плагинов, введенный в Gradle 7.0.

Настройка (gradle/libs.versions.toml):
[versions]
spring-boot = "2.7.18"
junit = "4.13.2"

[libraries]
spring-core = { group = "org.springframework", name = "spring-core", version.ref = "spring-boot" }
junit = { group = "junit", name = "junit", version.ref = "junit" }

[plugins]
spring-boot = { id = "org.springframework.boot", version.ref = "spring-boot" }


Использование:

plugins {
alias(libs.plugins.spring.boot)
}
dependencies {
implementation libs.spring.core
testImplementation libs.junit
}


Kotlin DSL:
plugins {
alias(libs.plugins.spring.boot)
}
dependencies {
implementation(libs.spring.core)
testImplementation(libs.junit)
}


Преимущества:

Централизованное управление версиями.
Улучшенная читаемость и автодополнение в IDE.
Упрощение обновления версий.


В памяти: Version Catalog загружается как часть модели проекта, добавляя минимальный overhead (10-20 МБ), но упрощает управление зависимостями, снижая вероятность конфликтов.


#Java #middle #Gradle #Task #include_projects
👍2
Сценарии и практики разделения: Core/Api/Impl

Разделение проекта на модули (Core, Api, Impl) — распространенная практика в корпоративной разработке для обеспечения модульности и повторного использования.

Core:
Содержит общую бизнес-логику, утилиты, модели данных.

Пример:
module-core/build.gradle:plugins {
id 'java-library'
}
dependencies {
implementation 'org.apache.commons:commons-lang3:3.12.0'
}


Api:
Определяет публичные интерфейсы, DTO или контракты.

Пример:
module-api/build.gradle:plugins {
id 'java-library'
}
dependencies {
api project(':module-core')
}


Impl:
Реализует интерфейсы из Api, добавляя конкретную функциональность.

Пример: module-impl/build.gradle:
plugins {
id 'java'
}
dependencies {
implementation project(':module-api')
}


Структура:
my-project/
├── module-core/
│ └── build.gradle
├── module-api/
│ └── build.gradle
├── module-impl/
│ └── build.gradle
├── build.gradle
├── settings.gradle


Практики:
Используйте api в модуле module-api для экспорта публичных интерфейсов.
Минимизируйте зависимости между модулями, чтобы избежать циклических зависимостей.
Централизуйте версии через Version Catalog или dependencyManagement в корневом build.gradle.


В памяти: Каждый модуль добавляет объект Project, задачи и зависимости в модель Gradle, увеличивая потребление памяти. Разделение на Core/Api/Impl уменьшает размер каждого модуля, но увеличивает общее количество объектов в памяти.



Gradle Composite Builds

Composite Builds позволяют включать другие Gradle-проекты как зависимости, без необходимости публикации в репозиторий.

Настройка:
В settings.gradle корневого проекта:
includeBuild '../other-project'


В build.gradle используйте проект как зависимость:
dependencies {
implementation project(':other-project:module-x')
}


Использование:
Полезно для разработки связанных проектов, находящихся в разных репозиториях.
Gradle автоматически разрешает зависимости между проектами.


В памяти: Composite Builds загружают модели всех включенных проектов в память, значительно увеличивая overhead (100-500 МБ на проект). Используйте с осторожностью для крупных систем.


Процесс сборки с помощью task-graph (Task Avoidance, Parallel Build)

Gradle строит граф задач (Directed Acyclic Graph, DAG) для определения порядка выполнения задач в многомодульных проектах.

Task Avoidance:

Gradle использует инкрементальную сборку, пропуская задачи, чьи входные/выходные данные не изменились (up-to-date checks).

Пример:
tasks.named('compileJava') {
inputs.files('src/main/java')
outputs.dir('build/classes/java/main')
}

В памяти: Gradle хранит хэши входов/выходов в памяти и ~/.gradle/caches, добавляя небольшой overhead (10-50 МБ).


Parallel Build:
Gradle поддерживает параллельное выполнение задач с флагом --parallel:
./gradlew build --parallel


#Java #middle #Gradle #Task #include_projects
👍2
Что выведет код?

import java.util.BitSet;

public class Task040825 {
public static void main(String[] args) {
BitSet bs1 = new BitSet();
bs1.set(65);

BitSet bs2 = new BitSet();
bs2.set(64);

bs1.and(bs2);
System.out.println(bs1.cardinality());
}
}


#Tasks
👍2
Варианты ответа:
Anonymous Quiz
37%
64
26%
2
32%
1
5%
0
👍2
Карточка для запоминания long 😎

#memory_card
👍2
Что такое URL и URLConnection в Java? 🤓

Ответ:

URL представляет интернет-адрес, а URLConnection позволяет взаимодействовать с ним (например, HTTP-запросы).

Пример:
URL url = new URL("
https://example.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
System.out.println(conn.getResponseCode()); // 200

Используется для сетевых операций, но для сложных задач лучше HTTP-клиенты (например, OkHttp).


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
📌 Факт дня:

А вы знали, что первый "цифровой сканер отпечатков пальцев" появился в 1998 году?

Compaq Fingerprint Identification, выпущенный в 1998 году, был первым устройством для ПК, использующим отпечатки пальцев для входа. Это предшествовало биометрии в смартфонах.

proof

#facts
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
ℹ️ Кто родился в этот день

Рюдигер Вальк (родился 5 августа 1945 г.) — немецкий математик и специалист по теоретической информатике, профессор Гамбургского университета, внёс значительный вклад в теорию автоматов и сетей Петри.

Самюэль Хосевар (родился 5 августа 1978 года) — французский программист, лидер проекта Debian (2007–2008), сооснователь группы информационной безопасности Goatse Security; внёс вклад в развитие свободного ПО (участвовал в проектах Debian и VLC)

#Biography #Birth_Date
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Раздел 4: Управляющие конструкции

Условные операторы. if / else в Java

Условные операторы if и else в Java позволяют выполнять разные части кода в зависимости от определенных условий. Они являются основой для управления потоком программы, позволяя принимать решения на основе значений переменных или выражений.


1. Что такое if и else в Java?

if и else — это ключевые слова в Java, которые используются для выполнения кода, если определенное условие истинно (true) или ложно (false). Они помогают программе выбирать, какой код запускать в зависимости от ситуации.

Зачем нужны if и else?
Принятие решений: Например, проверять, достаточно ли у пользователя денег для покупки.
Управление потоком: Позволяют программе выполнять разные действия в разных случаях.
Читаемость: Делают код понятным, показывая, какие действия зависят от условий.
Гибкость: Позволяют писать программы, которые реагируют на разные входные данные.



2. Синтаксис if и else

if проверяет условие, и если оно истинно (true), выполняется блок кода. else указывает, что делать, если условие ложно (false). Условие — это выражение, которое возвращает boolean (true или false).

Общий синтаксис:
if (условие) {
// Код, который выполняется, если условие истинно
} else {
// Код, который выполняется, если условие ложно
}


Простой пример:
int age = 18;
if (age >= 18) {
System.out.println("Вы взрослый!");
} else {
System.out.println("Вы несовершеннолетний!");
}

Вывод: Вы взрослый!


Вариации синтаксиса:
Простой if (без else):
if (age >= 18) {
System.out.println("Вы можете голосовать!");
}


Многоуровневый if-else (else if):

int score = 85;
if (score >= 90) {
System.out.println("Отлично!");
} else if (score >= 70) {
System.out.println("Хорошо!");
} else {
System.out.println("Попробуйте еще раз!");
}

Вывод: Хорошо!


Однострочный if (без фигурных скобок, если только одна команда):
if (age >= 18) System.out.println("Вы взрослый!");


Примечания к синтаксису:
Условие в скобках должно возвращать boolean (true или false).
Фигурные скобки {} обязательны, если блок кода содержит больше одной строки.
else и else if необязательны.



3. Типы конструкций if / else

3.1. Простой if
Используется, когда нужно выполнить код только при истинном условии.

Пример:
int temperature = 25;
if (temperature > 20) {
System.out.println("На улице тепло!");
}

Вывод: На улице тепло!


3.2. if с else
Выполняет один блок кода, если условие истинно, и другой — если ложно.

Пример:
int number = 10;
if (number % 2 == 0) {
System.out.println("Число четное!");
} else {
System.out.println("Число нечетное!");
}

Вывод: Число четное!


3.3. if с else if
Позволяет проверять несколько условий последовательно.

Пример:
int grade = 75;
if (grade >= 90) {
System.out.println("Оценка: A");
} else if (grade >= 80) {
System.out.println("Оценка: B");
} else if (grade >= 70) {
System.out.println("Оценка: C");
} else {
System.out.println("Оценка: D");
}

Вывод: Оценка: C


3.4. Вложенные if
if внутри другого if для более сложных проверок.

Пример:
int age = 20;
boolean hasID = true;
if (age >= 18) {
if (hasID) {
System.out.println("Можно войти!");
} else {
System.out.println("Нужен документ!");
}
} else {
System.out.println("Слишком молод!");
}

Вывод: Можно войти!



4. Правильное применение if / else

Чтобы писать понятный и эффективный код с if и else, следуйте этим рекомендациям:

4.1. Простота условий
Пишите простые и понятные условия. Разбивайте сложные выражения на переменные.

Пример:
// Плохо: сложное условие
if (score >= 70 && score <= 100 && isExamPassed) {
System.out.println("Экзамен сдан!");
}

// Хорошо: разбиваем на части
boolean isValidScore = score >= 70 && score <= 100;
if (isValidScore && isExamPassed) {
System.out.println("Экзамен сдан!");
}



#Java #для_новичков #beginner #if #else
👍3