job4j.ru - Практика. Ревью. Результат.
771 subscribers
75 photos
186 links
О жизни в IT:
- Языки: Go, Rust, Java, Kotlin
- Технологии: PostgreSQL, Kafka
- Инфраструктура: Docker, Kubernetes
- Soft Skills: общение, интервью, карьера
Download Telegram
Часто на собеседованиях дают задачу провести код-ревью.
Сегодняшняя задача — код-ревью.

Компания: ТБанк
Задание: Произвести рефакторинг приведенного ниже кода.

Свои ответы и предложения по улучшению кода пишите в комментариях.

Код для ревью:
@Controller
public class CartController {
@Resource
private CalculationService calculationService;

@RequestMapping(value = "/", method = RequestMethod.POST)
public String calculate(@RequestParam(value = "products") String products,
@RequestParam(value = "deliveryType") String deliveryType, Model model) {
try {
ObjectMapper mapper = new ObjectMapper();
List<Product> productsList = mapper.readValue(products, new TypeReference<List<Product>>() {});

Cart cart = new Cart(productsList);
calculationService.calculateProductsCost(cart, deliveryType);
calculationService.calculateDeliveryCost(cart, deliveryType);
calculationService.calculateDiscount(cart, deliveryType);

double totals = calculationService.productsCost + calculationService.deliveryCost - calculationService.discount;
String response = "<br/>Стоимость продуктов = " + calculationService.productsCost +
"<br/>Стоимость доставки = " + calculationService.deliveryCost +
"<br/>Скидка = " + calculationService.discount +
"<br/>ИТОГО = " + totals;

model.addAttribute("response", response);
} catch (JsonProcessingException e) {
model.addAttribute("response", "ERROR!");
}
return "index";
}
}


public class Cart implements Serializable {
private List<Product> products;

public class Product {
private double cost;
private int quantity;

@Component(value = "calculationService")
public class CalculationService {
double productsCost = 0.0;
double deliveryCost = 0.0;
double discount = 0.0;

private double reactFactor = 1.05;

void calculateProductsCost(Cart cart, String deliveryType) {
if (deliveryType.equals("TOTIME")) {
cart.getProducts().forEach(product -> productsCost += product.getCost() * product.getQuantity());
} else if (deliveryType.equals("REACT")) {
cart.getProducts().forEach(product -> productsCost += product.getCost() * product.getQuantity() * reactFactor);
}
}

void calculateDeliveryCost(Cart cart, String deliveryType) {
if (deliveryType.equals("TOTIME")) {
deliveryCost = cart.getProducts().size() > 10 ? 100.0 : 300.0;
} else if (deliveryType.equals("REACT")) {
deliveryCost = productsCost > 1000.0 ? 0.0 : 500.0 * reactFactor;
}
}

void calculateDiscount(Cart cart, String deliveryType) {
if (deliveryType.equals("TOTIME")) {
discount = productsCost >= 1000.0 && cart.getProducts().size() > 10 ? 100.0 : 0.0;
} else if (deliveryType.equals("REACT")) {
discount = productsCost >= 2000.0 ? 150.0 : 0.0;
}
}
}
🔥3
Ребята и девчата, давайте поделимся, кто чем пользуется для обхода блокировок Youtube.
Job4j + AI: Теперь в проекте Job4j внедрён искусственный интеллект. Первая функция - "AI, объясни". Выделяйте текст урока и попросите AI дать объяснение.
🔥21
Ежедневное упражнение.
Поиск общего числа в трех списках.
https://job4j.ru/profile/topics/30/task_code/561/new_task
Оцените сложность и затраты по памяти.
Правильное решение занимает n * log(n), а не n ^ 3.
👍4
📝 Ежедневное упражнение

Сегодняшняя задача — Конвертация римских чисел в арабские! 🏛🔢

Попробуйте написать метод, который преобразует римские числа, такие как X, IV, или MCMXCIV, в их арабские аналоги.

🚀 Готовы попробовать свои силы? Перейдите по ссылке, чтобы начать:

🔗 [Задание на сайте Job4j](https://job4j.ru/profile/topics/29/task_code/562/new_task)
👍5
📝 Ежедневное упражнение

Сегодняшняя задача — Найти ближайшего общего предка (LCA) двух узлов в бинарном дереве! 🌳🔍

Попробуйте написать метод, который находит ближайшего общего предка для двух узлов в бинарном дереве, например, для узлов 5 и 1 в дереве, где общий предок — 3.

🚀 Готовы попробовать свои силы? Перейдите по ссылке, чтобы начать:

🔗 [Задание на сайте Job4j](https://job4j.ru/profile/topics/205/task_code/563/new_task)
👍1
Осенний курс: Spring Core & AOP

Готовы к глубокому погружению в Spring? В нашем новом курсе по Spring Core и AOP вас ждёт 45 уроков с поддержкой от ментора!

Что вас ждёт в программе:
1. Основы Spring
2. IoC, DI, ApplicationContext
3. AOP и ещё многое другое
4. Работа с Telegram API

Практическая часть включает создание проекта «Бот-Помощник по Настроению», который поможет вам закрепить полученные знания на практике. По завершении курса вас ждёт теоретический экзамен, но время прохождения не ограничено.

Стоимость курса — 4990 рублей.

Присоединяйтесь и начните уже сегодня!
➡️ [Ссылка на курс](https://job4j.ru)
🔥5👍1
Компания Call Insight ищет специалиста по разработке программного обеспечения для работы над различными проектами. Вакансия идеально подойдет тем, кто имеет опыт работы с Java Core, SQL, JDBC, а также знаком с основами Spring и JPA+Hibernate.

Условия:
💸 Испытательный срок – 2 месяца, з/п – 60 тыс. руб. После успешного прохождения – 80 тыс.

Направления:
➡️ Разработка нового функционала голосовых помощников
➡️ Анкеты для голосовых роботов
➡️ Автоматизация бизнес-процессов call-центра
➡️ Структуры БД и хранимые процедуры для отчетности call-центров
➡️ Новый функционал для роботизированной платформы искусственного интеллекта

Технологии:
– Java 8/11, Spring 4.3/5.x, VXML, MySQL 5.7/8, Angular, Swagger, GitLab

Резюме отправлять в формате PDF на адрес @parsentev.
🚀 Новая функция в проекте: Тренировка вопросов для собеседований!

Мы добавили мощный инструмент для подготовки к собеседованиям:

🔹 Темы и вопросы: Выбирай интересующую тему и отвечай на вопросы.

🔹 AI-проверка: Наш AI анализирует твой ответ, оценивает его по 100-балльной шкале и дает развернутое объяснение.

🔹 Отслеживание прогресса: Каждый ответ сохраняется в истории. На основе качества ответов вопросы сортируются в группы — слабые, средние, сильные. Это помогает лучше запомнить сложные темы и повторять их для усиления.

🎯 Такой подход сделает твою подготовку более эффективной!

Переходи в раздел и начни тренироваться: [job4j.ru/profile Упражения -> Собеседования](https://job4j.ru/profile)
🔥16👍5
📌 Сегодняшний вопрос из собеседования:

Из-за чего может возникать `NoClassDefFoundError` и `NoSuchMethodError`?

👉 Более подробно о вопросе можно узнать по ссылке: [Job4j](https://job4j.ru/profile/interview/4/question/5)
🔍 Сегодняшний вопрос из собеседования:

Объясните отличие анонимного класса от локального класса?

Проверь свои знания и получи подробное объяснение! 💡

👉 [Проверь свои знания](https://job4j.ru/profile/interview/5/question/6)
🔥4👍1
🚀 Новое видео на тему тренировки вопросов из собеседований!

Готовитесь к важному интервью и хотите улучшить свои навыки? Мы выпустили новое видео, которое поможет вам отточить ответы на сложные вопросы, которые часто задают на собеседованиях. Не пропустите полезные советы и примеры, чтобы уверенно проходить интервью и получить работу мечты!

📹 Смотрите видео на разных платформах:

- Rutube: [Ссылка на видео](https://rutube.ru/video/878f5b7c093a42ababb0bc0572cbc148/)
- YouTube: [Ссылка на видео](https://youtu.be/G9uW-M9PgRw)
- VK: [Ссылка на видео](https://vk.com/video298358674_456239269)

Успех на собеседовании начинается с тренировки! 💼💡
🔍 Сегодняшний вопрос из собеседования:

Что такое ELK-стек?

Проверь свои знания и получи подробное объяснение! 💡

👉 [Проверь свои знания](https://job4j.ru/profile/interview/6/question/7)
👍1🔥1
📌 Сегодняшний вопрос из собеседования:

Расскажите про 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
🔥3👍1
Группировка и статистика URL по шаблонам

В новой задаче нужно сгруппировать 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)
🤯2👍1
На моем канале есть видео «ТОП 5 ошибок в изучении программирования», где я делюсь тем, какие поведенческие и ментальные ошибки могут препятствовать вашему прогрессу в IT.
👍2
Перечислю их:

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) и узнай, что думают эксперты! 🔍✨
👍2