🚀 Новое видео на тему тренировки вопросов из собеседований!
Готовитесь к важному интервью и хотите улучшить свои навыки? Мы выпустили новое видео, которое поможет вам отточить ответы на сложные вопросы, которые часто задают на собеседованиях. Не пропустите полезные советы и примеры, чтобы уверенно проходить интервью и получить работу мечты!
📹 Смотрите видео на разных платформах:
- Rutube: [Ссылка на видео](https://rutube.ru/video/878f5b7c093a42ababb0bc0572cbc148/)
- YouTube: [Ссылка на видео](https://youtu.be/G9uW-M9PgRw)
- VK: [Ссылка на видео](https://vk.com/video298358674_456239269)
Успех на собеседовании начинается с тренировки! 💼💡
Готовитесь к важному интервью и хотите улучшить свои навыки? Мы выпустили новое видео, которое поможет вам отточить ответы на сложные вопросы, которые часто задают на собеседованиях. Не пропустите полезные советы и примеры, чтобы уверенно проходить интервью и получить работу мечты!
📹 Смотрите видео на разных платформах:
- Rutube: [Ссылка на видео](https://rutube.ru/video/878f5b7c093a42ababb0bc0572cbc148/)
- YouTube: [Ссылка на видео](https://youtu.be/G9uW-M9PgRw)
- VK: [Ссылка на видео](https://vk.com/video298358674_456239269)
Успех на собеседовании начинается с тренировки! 💼💡
RUTUBE
Тренировка вопросов для собеседований! Java | Kotlin | SQL
Тренировка вопросов для собеседований!
Мы добавили мощный инструмент для подготовки к собеседованиям:
🔹 Темы и вопросы: Выбирай интересующую тему и отвечай на вопросы.
🔹 AI-проверка: Наш AI анализирует твой ответ, оценивает его по 100-балльной шкале и…
Мы добавили мощный инструмент для подготовки к собеседованиям:
🔹 Темы и вопросы: Выбирай интересующую тему и отвечай на вопросы.
🔹 AI-проверка: Наш AI анализирует твой ответ, оценивает его по 100-балльной шкале и…
🔍 Сегодняшний вопрос из собеседования:
Что такое ELK-стек?
Проверь свои знания и получи подробное объяснение! 💡
👉 [Проверь свои знания](https://job4j.ru/profile/interview/6/question/7)
Что такое ELK-стек?
Проверь свои знания и получи подробное объяснение! 💡
👉 [Проверь свои знания](https://job4j.ru/profile/interview/6/question/7)
👍1🔥1
📌 Сегодняшний вопрос из собеседования:
Расскажите про Maven Scope?
👉 Проверь ответ и получи объяснение: https://job4j.ru/profile/interview/8/question/11
Расскажите про Maven Scope?
👉 Проверь ответ и получи объяснение: https://job4j.ru/profile/interview/8/question/11
🔥5
💻 Проверь свои знания по корутинам в Kotlin перед собеседованием!
Корутины — это одна из ключевых тем в Kotlin, которая часто встречается на собеседованиях. Готовы ли вы к вопросам по этой теме?
🚀 Ответьте на 23 вопроса с собеседований и убедитесь, что ваши знания на высоте! Подготовьтесь к следующему этапу карьеры и получите полезные рекомендации по улучшению навыков.
👉 Начать проверку можно по ссылке: [job4j.ru/profile/interview/9](https://job4j.ru/profile/interview/9)
Не упустите возможность подготовиться к собеседованию на высоком уровне! #Kotlin #Coroutines #Job4j
Корутины — это одна из ключевых тем в Kotlin, которая часто встречается на собеседованиях. Готовы ли вы к вопросам по этой теме?
🚀 Ответьте на 23 вопроса с собеседований и убедитесь, что ваши знания на высоте! Подготовьтесь к следующему этапу карьеры и получите полезные рекомендации по улучшению навыков.
👉 Начать проверку можно по ссылке: [job4j.ru/profile/interview/9](https://job4j.ru/profile/interview/9)
Не упустите возможность подготовиться к собеседованию на высоком уровне! #Kotlin #Coroutines #Job4j
🔥3👍1
Группировка и статистика URL по шаблонам
В новой задаче нужно сгруппировать URL по шаблонам и собрать статистику посещений. Задача отлично подходит для тренировки работы с коллекциями, строками и алгоритмами подсчета. Подготовьтесь к решению интересной проблемы и улучшите свои навыки Java!
Ссылка на задачу: https://job4j.ru/profile/topics/29/task_code/564/new_task
Присоединяйтесь к обсуждению и делитесь своими решениями!
В новой задаче нужно сгруппировать URL по шаблонам и собрать статистику посещений. Задача отлично подходит для тренировки работы с коллекциями, строками и алгоритмами подсчета. Подготовьтесь к решению интересной проблемы и улучшите свои навыки Java!
Ссылка на задачу: https://job4j.ru/profile/topics/29/task_code/564/new_task
Присоединяйтесь к обсуждению и делитесь своими решениями!
👍6
Навигационная аналитика: проектирование системы сбора данных
Представьте, что у вас есть веб-приложение с более чем 5000 активными пользователями. Как спроектировать систему для сбора и анализа посещаемых страниц?
- Сбор данных через логи или трекеры.
- Масштабирование с помощью распределенных систем (Kafka, PostgreSQL).
- Анализ через Spark или ELK стек.
- Ускорение за счёт кэширования и параллельных вычислений.
Как бы вы подошли к решению этой задачи?
👉 [Подробнее на Job4j](https://job4j.ru/profile/interview/10/question/127)
Представьте, что у вас есть веб-приложение с более чем 5000 активными пользователями. Как спроектировать систему для сбора и анализа посещаемых страниц?
- Сбор данных через логи или трекеры.
- Масштабирование с помощью распределенных систем (Kafka, PostgreSQL).
- Анализ через Spark или ELK стек.
- Ускорение за счёт кэширования и параллельных вычислений.
Как бы вы подошли к решению этой задачи?
👉 [Подробнее на Job4j](https://job4j.ru/profile/interview/10/question/127)
🤯2👍1
Перечислю их:
1. Отсутствие цели или ее неопределенность.
2. Отсутствие плана.
3. Недостаток регулярности.
4. Слишком сильный уклон в теорию.
5. Перфекционизм.
Это видео было записано 7 лет назад. За эти годы я приобрел значительный дополнительный опыт как в программировании, так и в преподавании. Первое, на что хотелось бы обратить внимание, — все указанные выше ошибки относятся к самостоятельной работе, так называемому пути "одиночного воина" или самурая. На первом этапе этот подход очень важен, и, в зависимости от ваших целей, первые 5–10 лет вы действительно можете развиваться самостоятельно.
"Ого!" — скажете вы. "Но ведь есть примеры, когда за год люди становятся сеньорами!" К сожалению, большинство из нас склонно к тщеславию и живет в иллюзиях по поводу своих достижений. Самостоятельный путь часто вводит в заблуждение, когда вы полагаетесь только на свой опыт и упускаете возможность учиться на опыте других.
Для полноценного развития в каждом этапе жизни у нас должны быть три роли: учитель, товарищ и ученик. Однако часто происходит перекос: мы стремимся быть учителями, диктовать свои правила и давать советы. Роль товарища реализуется слабо или посредственно. А советы других мы часто игнорируем из-за гордости и убежденности в своей правоте. В результате, после школы или института наш прогресс начинает резко замедляться.
Чтобы этого избежать, вам нужен учитель, ментор или наставник — человек, который будет делиться с вами своим опытом и знаниями. Возникает вопрос: где его найти? Нет, я не собираюсь рекламировать свои курсы. Вам нужен не просто формальный статус ученика на каком-либо курсе, а реальные отношения с наставником.
Приведу пример из своего опыта. Когда я учился в институте, к нам в группу пришел парень, который увлеченно рассказывал о компьютерах, программировании и всем, что с этим связано. Он стал для меня первым учителем, который открыл для меня мир программирования. Я внимательно слушал его, искренне интересовался и задавал вопросы. На первой работе моим учителем стал мой начальник.
Можно выделить несколько важных черт таких отношений:
1. Учитель должен быть увлечен своим делом — программированием.
2. Учитель должен быть способен делиться своими знаниями. Бывает, что человек — отличный профессионал, но передать знания не может.
3. Ученик должен воспринимать знания учителя с уважением и интересом.
4. Учитель должен иметь возможность напрямую взаимодействовать с учеником, чтобы корректировать его действия и мышление.
Таким образом, учителем для вас может стать любой человек, обладающий этими качествами: коллега, начальник или просто профессионал в своей области.
И в завершение хочу подчеркнуть важность самого понятия "отношения". Процесс обучения — это взаимный процесс, в котором один участник хочет делиться знаниями и опытом, а другой — их получать. Ключевым навыком здесь является умение общаться, задавать вопросы и делиться результатами.
1. Отсутствие цели или ее неопределенность.
2. Отсутствие плана.
3. Недостаток регулярности.
4. Слишком сильный уклон в теорию.
5. Перфекционизм.
Это видео было записано 7 лет назад. За эти годы я приобрел значительный дополнительный опыт как в программировании, так и в преподавании. Первое, на что хотелось бы обратить внимание, — все указанные выше ошибки относятся к самостоятельной работе, так называемому пути "одиночного воина" или самурая. На первом этапе этот подход очень важен, и, в зависимости от ваших целей, первые 5–10 лет вы действительно можете развиваться самостоятельно.
"Ого!" — скажете вы. "Но ведь есть примеры, когда за год люди становятся сеньорами!" К сожалению, большинство из нас склонно к тщеславию и живет в иллюзиях по поводу своих достижений. Самостоятельный путь часто вводит в заблуждение, когда вы полагаетесь только на свой опыт и упускаете возможность учиться на опыте других.
Для полноценного развития в каждом этапе жизни у нас должны быть три роли: учитель, товарищ и ученик. Однако часто происходит перекос: мы стремимся быть учителями, диктовать свои правила и давать советы. Роль товарища реализуется слабо или посредственно. А советы других мы часто игнорируем из-за гордости и убежденности в своей правоте. В результате, после школы или института наш прогресс начинает резко замедляться.
Чтобы этого избежать, вам нужен учитель, ментор или наставник — человек, который будет делиться с вами своим опытом и знаниями. Возникает вопрос: где его найти? Нет, я не собираюсь рекламировать свои курсы. Вам нужен не просто формальный статус ученика на каком-либо курсе, а реальные отношения с наставником.
Приведу пример из своего опыта. Когда я учился в институте, к нам в группу пришел парень, который увлеченно рассказывал о компьютерах, программировании и всем, что с этим связано. Он стал для меня первым учителем, который открыл для меня мир программирования. Я внимательно слушал его, искренне интересовался и задавал вопросы. На первой работе моим учителем стал мой начальник.
Можно выделить несколько важных черт таких отношений:
1. Учитель должен быть увлечен своим делом — программированием.
2. Учитель должен быть способен делиться своими знаниями. Бывает, что человек — отличный профессионал, но передать знания не может.
3. Ученик должен воспринимать знания учителя с уважением и интересом.
4. Учитель должен иметь возможность напрямую взаимодействовать с учеником, чтобы корректировать его действия и мышление.
Таким образом, учителем для вас может стать любой человек, обладающий этими качествами: коллега, начальник или просто профессионал в своей области.
И в завершение хочу подчеркнуть важность самого понятия "отношения". Процесс обучения — это взаимный процесс, в котором один участник хочет делиться знаниями и опытом, а другой — их получать. Ключевым навыком здесь является умение общаться, задавать вопросы и делиться результатами.
👍12❤4🔥4
💡 Сегодняшний вопрос с собеседования:
🛠 Как управлять состоянием базы данных PostgreSQL при запуске и перезапуске контейнера Docker? 🐳💻
Уверен в ответе? Проверь свои знания на [сайте](https://job4j.ru/profile/interview/13/question/168) и узнай, что думают эксперты! 🔍✨
🛠 Как управлять состоянием базы данных PostgreSQL при запуске и перезапуске контейнера Docker? 🐳💻
Уверен в ответе? Проверь свои знания на [сайте](https://job4j.ru/profile/interview/13/question/168) и узнай, что думают эксперты! 🔍✨
👍2
🔧 Новый курс по CI/CD — Ваша путеводная звезда в автоматизации! 🚀
🎓 Дата запуска: 1 декабря 2024 года
Стоимость по предпродаже: 7990 рублей
Стоимость после 1 декабря: 9990 рублей
Вы давно хотели освоить CI/CD и автоматизировать свои процессы разработки? Мы подготовили уникальный курс на стеке Java, Maven, Spring, Docker, Jenkins и PostgreSQL, который научит вас всему необходимому для внедрения и работы с современными DevOps-инструментами!
### 🎯 В курсе вы узнаете:
- Введение в CI/CD: Что такое CI/CD, как оно помогает ускорить и улучшить качество разработки.
- Maven и Автоматизация Сборки: Как настроить Maven для управления зависимостями и автоматизации.
- Jenkins и Автоматизация CI: Как настроить Jenkins для автоматической сборки и тестирования.
- Docker и Контейнеризация: Как упаковать приложения в Docker и автоматизировать деплой.
- Построение Полного CI/CD Пайплайна: Полный цикл CI/CD, от написания кода до деплоя.
- Работа с PostgreSQL в CI/CD: Автоматизация миграций баз данных и управление ими.
- Углубление в CI/CD Практики: Продвинутые техники оптимизации и мониторинга CI/CD процессов.
- Финальный проект: Практическая реализация полного CI/CD пайплайна с нуля.
---
📅 Старт курса: 1 декабря 2024 года
Цена по предпродаже: 7990 рублей
Цена после 1 декабря: 9990 рублей
Успейте записаться сейчас и получите полный доступ к курсу по сниженной цене! 🌟
Для подробностей и регистрации пишите в личные сообщения или переходите по ссылке.
👨💻 Этот курс — ваш шаг к автоматизации и профессиональному росту в мире DevOps и CI/CD!
#ci_cd #курс #DevOps #docker #jenkins #maven #spring #java #postgresql
🎓 Дата запуска: 1 декабря 2024 года
Стоимость по предпродаже: 7990 рублей
Стоимость после 1 декабря: 9990 рублей
Вы давно хотели освоить CI/CD и автоматизировать свои процессы разработки? Мы подготовили уникальный курс на стеке Java, Maven, Spring, Docker, Jenkins и PostgreSQL, который научит вас всему необходимому для внедрения и работы с современными DevOps-инструментами!
### 🎯 В курсе вы узнаете:
- Введение в CI/CD: Что такое CI/CD, как оно помогает ускорить и улучшить качество разработки.
- Maven и Автоматизация Сборки: Как настроить Maven для управления зависимостями и автоматизации.
- Jenkins и Автоматизация CI: Как настроить Jenkins для автоматической сборки и тестирования.
- Docker и Контейнеризация: Как упаковать приложения в Docker и автоматизировать деплой.
- Построение Полного CI/CD Пайплайна: Полный цикл CI/CD, от написания кода до деплоя.
- Работа с PostgreSQL в CI/CD: Автоматизация миграций баз данных и управление ими.
- Углубление в CI/CD Практики: Продвинутые техники оптимизации и мониторинга CI/CD процессов.
- Финальный проект: Практическая реализация полного CI/CD пайплайна с нуля.
---
📅 Старт курса: 1 декабря 2024 года
Цена по предпродаже: 7990 рублей
Цена после 1 декабря: 9990 рублей
Успейте записаться сейчас и получите полный доступ к курсу по сниженной цене! 🌟
Для подробностей и регистрации пишите в личные сообщения или переходите по ссылке.
👨💻 Этот курс — ваш шаг к автоматизации и профессиональному росту в мире DevOps и CI/CD!
#ci_cd #курс #DevOps #docker #jenkins #maven #spring #java #postgresql
🔥10👍6
Сегодняшний вопрос с собеседования
💡 *Объясните, что такое динамическое связывание?*
Проверь свой ответ и получи разбор по ссылке:
[Проверь ответ тут](https://job4j.ru/profile/interview/15/question/220)
Погружаемся в Java на новом уровне! 💻
💡 *Объясните, что такое динамическое связывание?*
Проверь свой ответ и получи разбор по ссылке:
[Проверь ответ тут](https://job4j.ru/profile/interview/15/question/220)
Погружаемся в Java на новом уровне! 💻
👍1
Обновления платформы:
1. Добавили историю ответов.
2. Добавили общее количество ответов.
3. Получить ответ без решения. Удобно для ознакомления.
Продолжаем тренироваться https://job4j.ru/profile/interview
1. Добавили историю ответов.
2. Добавили общее количество ответов.
3. Получить ответ без решения. Удобно для ознакомления.
Продолжаем тренироваться https://job4j.ru/profile/interview
Еще один вопрос с собеседования
🤔 *Какой метод будет вызван в случае перегрузки параметра
Проверь себя и узнай подробности тут:
[Проверь ответ тут](https://job4j.ru/profile/interview/15/question/221)
Углубляем понимание полиморфизма и перегрузки методов! 💡
🤔 *Какой метод будет вызван в случае перегрузки параметра
Object на String?*Проверь себя и узнай подробности тут:
[Проверь ответ тут](https://job4j.ru/profile/interview/15/question/221)
Углубляем понимание полиморфизма и перегрузки методов! 💡
🔥 Задача с собеседования | Kotlin: Определение языка 🔥
Реализовать метод
Ответы пишите в комментариях.
#Собеседования_в_IT #Вопросы_по_Kotlin
Реализовать метод
countBy в классе IdentifyLang, который будет подсчитывать количество строк, содержащих символы из заданного диапазона. Этот метод станет основой для определения языка на основе переданного словаря lex. Если количество английских символов больше либо равно количеству русских, метод вернёт английский язык. Иначе — русский.class IdentifyLang(val lex: Set<String>) {
private val englishRange = 'a' .. 'z'
private val russianRange = 'а'.. 'я'
enum class Lang {
RUS, ENG, UNKNOWN
}
private fun Set<String>.countBy(range: CharRange): Long
= ...
fun lang(): Lang = if (lex.countBy(englishRange) >= lex.countBy(russianRange)) {
Lang.ENG
} else {
Lang.RUS
}
}Ответы пишите в комментариях.
#Собеседования_в_IT #Вопросы_по_Kotlin
Вопрос с собеседования IT: Легендарный вопрос о String pool.
❓ *Объясните, что такое
Проверь себя и узнай подробности здесь:
[Проверь ответ тут](https://job4j.ru/profile/interview/4/question/246)
📚 Понимание работы строк в Java — ключ к эффективному программированию!
#Java #StringPool #ITвопрос #собеседование #программирование #вопросыJava #JavaInterview
❓ *Объясните, что такое
String pool в Java, и как он влияет на сравнение строк?*Проверь себя и узнай подробности здесь:
[Проверь ответ тут](https://job4j.ru/profile/interview/4/question/246)
📚 Понимание работы строк в Java — ключ к эффективному программированию!
#Java #StringPool #ITвопрос #собеседование #программирование #вопросыJava #JavaInterview
🔥 Использование `this` в программировании: Мой путь и Kotlin-философия 🔥
Привет, ребята! 👋 Сегодня хочу поделиться своим опытом по поводу использования
---
🔹 Начало пути: Чистый код и `this`
Когда я только начинал как программист, строго следовал правилам из классической книги Роберта Мартина "Чистый код". Одно из главных правил было всегда использовать `this`. Почему? 🤔
- Ясность:
- Читаемость: Код становится понятнее для других разработчиков.
---
🔹 Сомнения и поиск баланса
Со временем начал задумываться: Действительно ли нужно всегда использовать `this`? Иногда это приводит к загромождению кода:
Такой код выглядит шумно и тяжело читается. 🤯
---
🔹 Открытие Kotlin и новая философия
Познакомившись с Kotlin, понял, что язык предоставляет больше гибкости. В Kotlin
---
🔹 Советы от разработчиков Kotlin
Разработчики Kotlin рекомендуют использовать
Здесь
---
🔹 Мои выводы
💡 Используйте `this` осознанно — не следуйте правилам слепо. Важно, чтобы код оставался читабельным и понятным. Kotlin даёт свободу решать, когда
Баланс между явностью и лаконичностью — ключ к чистому коду. Помните, что цель — создавать понятный и поддерживаемый продукт, а не просто следовать правилам.
---
Спасибо, что прочитали! Надеюсь, мой опыт поможет вам в написании более чистого и понятного кода. Делитесь своими мыслями в комментариях! 💬👇
#программирование #Kotlin #ЧистыйКод #Советы #Разработка #Кодинг
Привет, ребята! 👋 Сегодня хочу поделиться своим опытом по поводу использования
this в коде. Надеюсь, вам будет интересно! 🚀---
🔹 Начало пути: Чистый код и `this`
Когда я только начинал как программист, строго следовал правилам из классической книги Роберта Мартина "Чистый код". Одно из главных правил было всегда использовать `this`. Почему? 🤔
- Ясность:
this явно показывает, что мы обращаемся к свойству или методу текущего объекта. class User(val name: String) {
fun updateName(name: String) {
this.name = name
}
}
- Читаемость: Код становится понятнее для других разработчиков.
---
🔹 Сомнения и поиск баланса
Со временем начал задумываться: Действительно ли нужно всегда использовать `this`? Иногда это приводит к загромождению кода:
this.service(this.value, this.otherValue, this.anotherProperty)
Такой код выглядит шумно и тяжело читается. 🤯
---
🔹 Открытие Kotlin и новая философия
Познакомившись с Kotlin, понял, что язык предоставляет больше гибкости. В Kotlin
this не обязателен, если нет конфликтов имен или необходимости явно указать контекст. Это позволяет писать более лаконичный код:fun updateName(name: String) {
this.name = name // Необходим здесь
}
fun displayName() {
println(name) // Здесь можно без `this`
}---
🔹 Советы от разработчиков Kotlin
Разработчики Kotlin рекомендуют использовать
this в определённых случаях, например, в расширяющих функциях:fun Set<String>.countBy(criteria: (String) -> Boolean): Int {
return this.count(criteria)
}Здесь
this помогает явно указать контекст, но иногда это может запутывать, если не добавляет ясности. 🤷♂️---
🔹 Мои выводы
💡 Используйте `this` осознанно — не следуйте правилам слепо. Важно, чтобы код оставался читабельным и понятным. Kotlin даёт свободу решать, когда
this действительно нужен, а когда можно обойтись без него.Баланс между явностью и лаконичностью — ключ к чистому коду. Помните, что цель — создавать понятный и поддерживаемый продукт, а не просто следовать правилам.
---
Спасибо, что прочитали! Надеюсь, мой опыт поможет вам в написании более чистого и понятного кода. Делитесь своими мыслями в комментариях! 💬👇
#программирование #Kotlin #ЧистыйКод #Советы #Разработка #Кодинг
👍8🔥1
✍️ Идиоматический Kotlin или адепты истинного языка
Начну с того, что наш проект Job4j написан на Kotlin. В 2018 году мы мигрировали его с Java, так что у меня есть некоторый опыт работы с этим языком. Почему мы выбрали именно Kotlin? Изначально меня привлекла его главная идея — лаконичный и понятный код. Этот принцип по-прежнему лежит в основе развития языка.
Основная концепция Kotlin заключается в том, чтобы свести дублирующийся код к минимуму. Разработчики языка замечают часто повторяющиеся конструкции и описывают их в виде функциональных блоков, которые могут быть встроены в сам язык. Однако, помимо этого, есть несколько распространенных проблем в программировании, которые Kotlin также помогает решить:
🚨 Проблемы:
1. Функции с побочными эффектами.
2. Изменяемые состояния.
3. Утилитарные классы.
💡 Kotlin призван устранить эти проблемы. Вот основные механизмы, которые помогают в этом:
1. Использование идиом языка.
2. Гибридная парадигма: сочетание ООП и функционального программирования.
3. Разделение данных и функций, а не создание объектов с состояниями и методами.
4. Предпочтение неизменяемых состояний.
5. Избегание наследования, если оно нужно лишь для сокращения кода. Вместо этого применяются расширения.
6. Избегание создания классов там, где можно использовать функции.
7. Использование областей видимости (scope) для управления доступом к полям и функциям.
Эти принципы достаточно гибкие и не содержат строгих критериев для оценки кода. Однако среди программистов на Kotlin можно выделить радикалов, которые оценивают код по количеству используемых идиом.
🤖 Адепты истинного Kotlin часто утверждают, что ваш код — это просто Java, написанная на Kotlin, и не имеет ничего общего с "настоящим" Kotlin. Такая позиция напоминает дискуссии о шаблонах проектирования, где сторонники определённых решений пытаются доказать "каноничность" своего подхода.
Пример из реальной жизни: кто-то может сказать, что ваш декоратор "неправильный", потому что нарушает "каноны банды четырёх". Или, при код-ревью, коллега язвительно замечает, что ваш синглтон недостаточно "православный".
Похожая ситуация возникает, когда сторонники Scala утверждают, что их проект написан в "чистом функциональном стиле". Но стоит попросить их показать код, как они тут же находят причины, почему это невозможно (например, NDA).
🤔 Почему я критически отношусь к такому подходу? Потому что сторонники "агрессивного Kotlin" обычно не могут предложить конструктивных решений. Единственный их совет: *"Читайте библиотеки от разработчиков Kotlin"*. И здесь вспоминается фраза из фильма "ДМБ": "Видишь суслика? Нет. А он есть".
📝 Заключение
Kotlin — это мощный инструмент, предлагающий более лаконичные и безопасные решения по сравнению с Java. Однако стремление к чистоте кода и бездумное следование идиомам не всегда ведет к лучшим результатам. Настоящее мастерство заключается в том, чтобы не просто использовать возможности языка, но и делать код понятным и поддерживаемым.
Крайности всегда вредны. Если код можно улучшить, важно предложить, как это сделать, а не ограничиваться односторонней критикой. В следующих статьях я буду сравнивать подходы ООП и гибридного стиля, демонстрируя, как идиоматический Kotlin помогает сделать код лучше, а не сложнее.
Начну с того, что наш проект Job4j написан на Kotlin. В 2018 году мы мигрировали его с Java, так что у меня есть некоторый опыт работы с этим языком. Почему мы выбрали именно Kotlin? Изначально меня привлекла его главная идея — лаконичный и понятный код. Этот принцип по-прежнему лежит в основе развития языка.
Основная концепция Kotlin заключается в том, чтобы свести дублирующийся код к минимуму. Разработчики языка замечают часто повторяющиеся конструкции и описывают их в виде функциональных блоков, которые могут быть встроены в сам язык. Однако, помимо этого, есть несколько распространенных проблем в программировании, которые Kotlin также помогает решить:
🚨 Проблемы:
1. Функции с побочными эффектами.
2. Изменяемые состояния.
3. Утилитарные классы.
💡 Kotlin призван устранить эти проблемы. Вот основные механизмы, которые помогают в этом:
1. Использование идиом языка.
2. Гибридная парадигма: сочетание ООП и функционального программирования.
3. Разделение данных и функций, а не создание объектов с состояниями и методами.
4. Предпочтение неизменяемых состояний.
5. Избегание наследования, если оно нужно лишь для сокращения кода. Вместо этого применяются расширения.
6. Избегание создания классов там, где можно использовать функции.
7. Использование областей видимости (scope) для управления доступом к полям и функциям.
Эти принципы достаточно гибкие и не содержат строгих критериев для оценки кода. Однако среди программистов на Kotlin можно выделить радикалов, которые оценивают код по количеству используемых идиом.
🤖 Адепты истинного Kotlin часто утверждают, что ваш код — это просто Java, написанная на Kotlin, и не имеет ничего общего с "настоящим" Kotlin. Такая позиция напоминает дискуссии о шаблонах проектирования, где сторонники определённых решений пытаются доказать "каноничность" своего подхода.
Пример из реальной жизни: кто-то может сказать, что ваш декоратор "неправильный", потому что нарушает "каноны банды четырёх". Или, при код-ревью, коллега язвительно замечает, что ваш синглтон недостаточно "православный".
Похожая ситуация возникает, когда сторонники Scala утверждают, что их проект написан в "чистом функциональном стиле". Но стоит попросить их показать код, как они тут же находят причины, почему это невозможно (например, NDA).
🤔 Почему я критически отношусь к такому подходу? Потому что сторонники "агрессивного Kotlin" обычно не могут предложить конструктивных решений. Единственный их совет: *"Читайте библиотеки от разработчиков Kotlin"*. И здесь вспоминается фраза из фильма "ДМБ": "Видишь суслика? Нет. А он есть".
📝 Заключение
Kotlin — это мощный инструмент, предлагающий более лаконичные и безопасные решения по сравнению с Java. Однако стремление к чистоте кода и бездумное следование идиомам не всегда ведет к лучшим результатам. Настоящее мастерство заключается в том, чтобы не просто использовать возможности языка, но и делать код понятным и поддерживаемым.
Крайности всегда вредны. Если код можно улучшить, важно предложить, как это сделать, а не ограничиваться односторонней критикой. В следующих статьях я буду сравнивать подходы ООП и гибридного стиля, демонстрируя, как идиоматический Kotlin помогает сделать код лучше, а не сложнее.
👍12
🚀 Ребята, продолжаю работу над курсом по Kotlin!
Сейчас добавил новые уроки в раздел Корутин:
📘 Введение в корутины Kotlin: Легковесная многозадачность для эффективной асинхронности [#505319]
📘 Как создать корутину в Kotlin [#505320]
Жду ваших решений по заданиям!
💡 Задание для всех, кто хочет попробовать свои силы в корутинах:
Реализация процесса загрузки через корутины
Описание:
Реализуйте консольное приложение на Kotlin, которое имитирует процесс загрузки с помощью корутин. Программа должна отображать процент выполнения (от 0% до 100%) с небольшими паузами между шагами, создавая эффект анимации. По завершении загрузки в консоли должно появиться сообщение об окончании.
Требования:
- Загрузка должна симулироваться с использованием корутин.
- Процент выполнения должен обновляться в консоли.
- Используйте функцию
- Сдайте задание, загрузив код в репозиторий и оставив ссылку на коммит.
🛠 Каркас для старта:
Присылайте решения в комментарии к этому посту! 👇
Сейчас добавил новые уроки в раздел Корутин:
📘 Введение в корутины Kotlin: Легковесная многозадачность для эффективной асинхронности [#505319]
📘 Как создать корутину в Kotlin [#505320]
Жду ваших решений по заданиям!
💡 Задание для всех, кто хочет попробовать свои силы в корутинах:
Реализация процесса загрузки через корутины
Описание:
Реализуйте консольное приложение на Kotlin, которое имитирует процесс загрузки с помощью корутин. Программа должна отображать процент выполнения (от 0% до 100%) с небольшими паузами между шагами, создавая эффект анимации. По завершении загрузки в консоли должно появиться сообщение об окончании.
Требования:
- Загрузка должна симулироваться с использованием корутин.
- Процент выполнения должен обновляться в консоли.
- Используйте функцию
delay() для создания задержек между шагами. - Сдайте задание, загрузив код в репозиторий и оставив ссылку на коммит.
🛠 Каркас для старта:
import kotlinx.coroutines.*
fun main() = runBlocking {
// TODO: Запустить корутину для симуляции процесса загрузки
}
fun simulateLoading() {
// TODO: В цикле симулировать процесс загрузки с выводом процента выполнения
// TODO: Использовать delay() для создания паузы между шагами
}
Присылайте решения в комментарии к этому посту! 👇
🛠 Коррутины vs. Thread: в чем разница?
Давайте посмотрим на два примера:
### Пример с ошибкой (Java):
На первый взгляд кажется, что флаг должен измениться на
### Пример без ошибок (Kotlin):
В Kotlin программа работает корректно и выводит
🔍 Дело в том, что в Java
💡 Этот и другие нюансы работы с корутинами мы разбираем на курсе по Kotlin на платформе https://job4j.ru/profile.
Давайте посмотрим на два примера:
### Пример с ошибкой (Java):
public class RaceConditionThread {
public static void main(String[] args) throws InterruptedException {
var flag = new boolean[] { true };
var job = new Thread(() -> flag[0] = false);
job.start();
job.join();
System.out.println(flag[0]);
}
}На первый взгляд кажется, что флаг должен измениться на
false, но программа выводит true. Почему? ### Пример без ошибок (Kotlin):
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
fun main() = runBlocking {
var flag = true;
val job = launch {
flag = false
}
job.join()
println(flag)
}
В Kotlin программа работает корректно и выводит
false. Как так получается? 🔍 Дело в том, что в Java
Thread напрямую работает с памятью, и операция может быть завершена до того, как мы ожидаем результат. В Kotlin корутины управляются диспетчером, который синхронизирует выполнение без возникновения гонок данных.💡 Этот и другие нюансы работы с корутинами мы разбираем на курсе по Kotlin на платформе https://job4j.ru/profile.
🔥4👍3
💡 Вчера я опубликовал пост о сравнении `Thread` и `Coroutines`. Пример с Java вызвал споры, и некоторые утверждали, что код будет работать корректно. Но писал-то я, и точно знаю, что в этом коде есть ошибка. Поэтому в продолжение темы, давайте разберёмся вместе.
📌 Рассмотрим код:
🤔 Где будет храниться переменная `flag`?
1. Массивы в Java — это объекты. Они создаются в куче (heap), которая общая для всех потоков.
2. Переменная
3. Поток
⚡️ Проблема:
- Гонки данных? ❌ Нет, поток
- Проблема видимости? ✅ Да, потому что массив не синхронизирован. Поток
🔍 Может ли решить проблему видимости гарантия `happens-before`?
Чтобы понять, как это работает, вспомним основные случаи happens-before:
1. Прямой порядок внутри потока:
Все действия в одном потоке происходят в том порядке, в котором они написаны в программе. Если действие A предшествует действию B, то "A happens-before B".
2. Синхронизация через `synchronized`:
Разблокировка монитора всегда происходит раньше, чем блокировка тем же монитором другим потоком.
3. Начало и завершение потоков:
- Вызов метода
- Вызов
4. Инициализация переменных:
Конструктор объекта гарантирует, что все его действия будут видны всем потокам, которые получают доступ к объекту.
5. Использование `volatile` переменных:
Запись в
Однако, даже несмотря на то, что
📝 Заключение:
Хотя вызов
📌 Рассмотрим код:
public static void main(String[] args) throws InterruptedException {
var flag = new boolean[] { true };
var job = new Thread(() -> flag[0] = false);
job.start();
job.join();
System.out.println(flag[0]);
}🤔 Где будет храниться переменная `flag`?
1. Массивы в Java — это объекты. Они создаются в куче (heap), которая общая для всех потоков.
2. Переменная
flag — локальная, и её ссылка хранится в стеке метода main. Однако сам массив (объект boolean[]) будет создан в куче.3. Поток
job меняет значение в массиве, который также хранится в куче, доступной обоим потокам.⚡️ Проблема:
- Гонки данных? ❌ Нет, поток
job не зависит от предыдущего состояния.- Проблема видимости? ✅ Да, потому что массив не синхронизирован. Поток
main может не увидеть изменение, сделанное потоком job.🔍 Может ли решить проблему видимости гарантия `happens-before`?
Чтобы понять, как это работает, вспомним основные случаи happens-before:
1. Прямой порядок внутри потока:
Все действия в одном потоке происходят в том порядке, в котором они написаны в программе. Если действие A предшествует действию B, то "A happens-before B".
2. Синхронизация через `synchronized`:
Разблокировка монитора всегда происходит раньше, чем блокировка тем же монитором другим потоком.
3. Начало и завершение потоков:
- Вызов метода
Thread.start() гарантирует, что все действия в вызывающем потоке происходят до любого действия в новом потоке. - Вызов
Thread.join() гарантирует, что все действия в потоке job произойдут до того, как поток main продолжит выполнение после join().4. Инициализация переменных:
Конструктор объекта гарантирует, что все его действия будут видны всем потокам, которые получают доступ к объекту.
5. Использование `volatile` переменных:
Запись в
volatile переменную гарантирует, что это действие происходит до всех последующих чтений этой переменной другими потоками.Однако, даже несмотря на то, что
job.join() заставляет поток main дождаться завершения потока job, операция записи в массив flag[0] может не быть видимой для потока main, так как массив не защищён ни синхронизацией, ни использованием volatile.📝 Заключение:
Хотя вызов
Thread.join() создаёт гарантии happens-before, в многопоточном окружении всегда нужно учитывать особенности модели памяти Java. Особенно это важно при работе с массивами и другими сложными структурами данных. Чтобы избежать проблем с видимостью, всегда стоит использовать дополнительные механизмы синхронизации, такие как volatile или synchronized.👍5🤩1
Снова про английский
Недавно одна из моих учениц устроилась на работу. Сейчас перед ней стоит задача выбора направления для дальнейшего развития, и одной из целей она выбрала овладение английским языком. В своем курсе по программированию я прошу учеников не браться сразу за несколько задач одновременно, а сфокусироваться на одной цели. В данном случае — это трудоустройство.
Изначально я считал, что английский язык крайне необходим для программиста. Раньше можно было выйти на иностранного заказчика и получать *10-15 долларов* в час, в то время как остальные зарабатывали *1-2 доллара*. Однако сейчас такие предложения найти сложно.
В условиях текущей ситуации работодатели уже не требуют владения английским языком. Конечно, это будет плюсом в вашем резюме, но не таким значительным. Тем не менее, владение английским языком остается полезным навыком.
Вернемся к моей ученице и обсудим, что ей посоветовать в плане изучения английского языка. Во-первых, нужно проанализировать, для каких задач нужен этот инструмент. В целом английский можно разделить на два больших навыка — получение информации и её производство.
В данном случае моей ученице необходимо уметь читать техническую литературу, форумы и статьи на английском языке. Это базовый навык, который не требует найма репетиторов.
### Какие упражнения нужно выполнять, чтобы натренировать навык чтения технической литературы:
1. Основные грамматические правила построения предложений. Без этого навыка будет сложно, но в технической литературе его отсутствие не так заметно, как в художественной.
2. Пассивный залог. В технической литературе крайне часто используется пассивный залог, поэтому стоит освежить в памяти, как он строится.
3. Словарный запас. Выбираем интересующую нас книгу или статью и выписываем все неизвестные слова. Важно завести отдельный словарь и выписывать слова вручную. Работу со словами лучше проводить после прочтения текста — сначала читаем, а потом работаем над сложными моментами. Часто можно понять значение слова из контекста, даже если оно вам не знакомо. Это называется *имплицитным* (неявным) процессом обучения, и он используется повсеместно.
### Полезные сервисы и приложения:
- Deepl.com — сервис, предоставляющий возможность переводить с одного языка на другой, а также редактировать написанный текст. Удобно использовать, если вы не поняли смысл предложения или хотите сравнить ваш перевод с переводом AI.
- Quizlet.com — флеш-карты. Как использовать? Читаем статью и записываем туда неизвестные слова, добавляем картинки с ассоциациями и текстом.
Важно уделять внимание дисциплине. Поставьте ежедневные напоминания для тренировок. Пусть это будет *10-20 минут*, но каждый день: *10 минут* чтения и *10 минут* повторения флеш-карт.
### Заключение
Изучение английского языка, несмотря на то, что это уже не обязательное требование для программиста, остается важным и полезным навыком, который расширяет доступ к информационным ресурсам и способствует профессиональному росту. В современном мире владение английским становится скорее конкурентным преимуществом, чем обязательным требованием. Поэтому важно трезво оценивать свои цели и решать, в каком объеме необходимо это знание.
А как вы изучаете английский язык? Напишите в комментариях свои способы и ежедневные упражнения — будем делиться опытом!
#EnglishLearning #Программирование #ТехническийАнглийский #Саморазвитие #Обучение #Советы
Недавно одна из моих учениц устроилась на работу. Сейчас перед ней стоит задача выбора направления для дальнейшего развития, и одной из целей она выбрала овладение английским языком. В своем курсе по программированию я прошу учеников не браться сразу за несколько задач одновременно, а сфокусироваться на одной цели. В данном случае — это трудоустройство.
Изначально я считал, что английский язык крайне необходим для программиста. Раньше можно было выйти на иностранного заказчика и получать *10-15 долларов* в час, в то время как остальные зарабатывали *1-2 доллара*. Однако сейчас такие предложения найти сложно.
В условиях текущей ситуации работодатели уже не требуют владения английским языком. Конечно, это будет плюсом в вашем резюме, но не таким значительным. Тем не менее, владение английским языком остается полезным навыком.
Вернемся к моей ученице и обсудим, что ей посоветовать в плане изучения английского языка. Во-первых, нужно проанализировать, для каких задач нужен этот инструмент. В целом английский можно разделить на два больших навыка — получение информации и её производство.
В данном случае моей ученице необходимо уметь читать техническую литературу, форумы и статьи на английском языке. Это базовый навык, который не требует найма репетиторов.
### Какие упражнения нужно выполнять, чтобы натренировать навык чтения технической литературы:
1. Основные грамматические правила построения предложений. Без этого навыка будет сложно, но в технической литературе его отсутствие не так заметно, как в художественной.
2. Пассивный залог. В технической литературе крайне часто используется пассивный залог, поэтому стоит освежить в памяти, как он строится.
3. Словарный запас. Выбираем интересующую нас книгу или статью и выписываем все неизвестные слова. Важно завести отдельный словарь и выписывать слова вручную. Работу со словами лучше проводить после прочтения текста — сначала читаем, а потом работаем над сложными моментами. Часто можно понять значение слова из контекста, даже если оно вам не знакомо. Это называется *имплицитным* (неявным) процессом обучения, и он используется повсеместно.
### Полезные сервисы и приложения:
- Deepl.com — сервис, предоставляющий возможность переводить с одного языка на другой, а также редактировать написанный текст. Удобно использовать, если вы не поняли смысл предложения или хотите сравнить ваш перевод с переводом AI.
- Quizlet.com — флеш-карты. Как использовать? Читаем статью и записываем туда неизвестные слова, добавляем картинки с ассоциациями и текстом.
Важно уделять внимание дисциплине. Поставьте ежедневные напоминания для тренировок. Пусть это будет *10-20 минут*, но каждый день: *10 минут* чтения и *10 минут* повторения флеш-карт.
### Заключение
Изучение английского языка, несмотря на то, что это уже не обязательное требование для программиста, остается важным и полезным навыком, который расширяет доступ к информационным ресурсам и способствует профессиональному росту. В современном мире владение английским становится скорее конкурентным преимуществом, чем обязательным требованием. Поэтому важно трезво оценивать свои цели и решать, в каком объеме необходимо это знание.
А как вы изучаете английский язык? Напишите в комментариях свои способы и ежедневные упражнения — будем делиться опытом!
#EnglishLearning #Программирование #ТехническийАнглийский #Саморазвитие #Обучение #Советы
👍11❤1