Тру-Джава
137 subscribers
31 photos
79 links
блог начинающего Java-программиста

Чат: https://t.me/trujavachat
Download Telegram
Всем привет!

Вчера прошел классный митап со студентами и выпускниками Яндекс.Практикум🔥

Митап прошел в классной и дружелюбной атмосфере, мне задавали много интересных вопросов.

Спасибо всем, у кого была возможность прийти на митап за поддержку и крутые вопросы!

Моя история в комиксах❤️
🔥24
Всем привет!

На прошлой неделе активно выбирала курс для прокачки навыков. Выбирала между двумя курсами, как писала выше, но в итоге решила пропустить пока этот поток.

В одном курсе не понравился формат, что совсем нет никаких текстовых материалов. В пятницу была встреча с преподавателем и менеджером второго курса.

Изначально говорили, что это вступительное собеседование, где бы определили примерно мой уровень и предложили индивидуальный подход. На деле мне задали всего два вопроса - как давно изучаю/работаю с Java и на каком стеке работаю сейчас. В остальном рассказывали про курс.

На втором курсе очень плотное расписание и я пока решила не идти на него тоже. Решила пройти курсы, которые у меня есть с udemy, старый курс от Алишева ещё есть, и сейчас идёт классная серия видео у канала Уголок сельского джависта.

Там и реактивное программирование, и Aouth2 security, и подключение kubernetes. В принципе из-за этих тем и хотела идти на сеньорский курс, пока не увидела в программе, что из безопасности они могут предложить только базовую авторизацию и с помощью jwt.
👍6💯2
Всем привет!

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

Когда я стала обсуждать свою идею с близкими людьми, они также сказали, что я могла бы рассказывать о своей учебе. Один коллега с курса написал как-то в чате, что если бы он решился написать о своем опыте обучения, у него получилась бы целая книга.

Другой человек сказал мне, что смысл ещё в том, что если мы пообещаем сделать что-то только перед самими собой, это очень легко нарушить. Ведь одно дело, ты обещаешь это перед многомиллионной публикой из 5 человек (именно столько у меня было подписчиков первые несколько месяцев), а другое дело только одному человеку - себе.

И это действительно мне много раз помогало, когда я возвращалась к своим забытым пет-проектам и делала их, чтобы было о чем рассказать здесь.

Один из таких заброшенных проектов лежит пылится ждет своего часа, но надеюсь ждать ему придётся ещё немного🤪

На название меня кстати вдохновил блог и сайт struchkov.dev, всем его рекомендую - там очень много полезных статей. Поэтому в названии есть часть моей фамилии и сферы интересов.

А сегодня я начала бесплатный интенсив. Там сразу первое задание применить аспекты, подключить кафку и базу данных. Но хотя бы не к понедельнику 😁
👍7👏4😁4
Всем привет!

В последнее время у меня появилось 2 активности "за компанию") 1 - это интенсив, а 2 - отбор на летнюю школу в Яндекс.

Расскажу про интересную вещь по второй активности. Наметила проходить первый этап отбора в прошлые выходные. Решила накануне потренироваться решать задачи и решить одну какую-нибудь с leetcode.

У меня несколько открытых вкладок было, одна из них была с задачей уровня easy с высоким процентом решения. Прочитала условие, примеры входных и выходных данных, подумала, что в принципе знаю как можно решить.

У меня есть проект на гитхабе, где я собираю решения всяких таких задач, но обычно я не копировала само условие задачи. Подумала, что надо исправиться, сделала над классом java doc, скопировала условие задачи и примеры данных и собралась пробовать свое решение.

Фишка в том, что на моем домашнем компьютере установлен плагин GigaCode, я его ещё до этого не тестировала, подумала заодно проверю, что это такое. Это проект от Сбера, они же делают gigaChat (похож на chatGPT).

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

Отправила на leetcode, решение прошло. Эксперимента ради открыла задачу, которую совсем не знала, как решать, также скопировала условие в java doc, тут гигакод не сразу мне всё точно дал, но когда дала ему нужный объект на возврат из метода, он тут же предложил решение и оно тоже прошло!

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

Надо будет в следующий раз отключать для тренировки решения задач с leetcode, а потом включать, если совсем застряну и буду в тупике)
🔥11👍3👏2
Всем привет!

На днях проходила интересная конференция Tech Train. В онлайн не получилось смотреть доклады, а вчера был свободный вечер и посмотрела несколько докладов, которыми захотелось поделиться.

Очень понравились доклады на тему развития: о менторстве - кто такой ментор и чем может быть полезен, менторская сессия с тремя участниками - задавали классные вопросы, которые можно задать себе и понять в какое направление хочешь двигаться дальше, от стажера до сеньора - по факту говорили больше от стажера до миддла, но всё равно полезно.

Также понравился доклад "думать как архитектор", но он специфический, в нем в основном были практические задания на то, какое решение в какой ситуации лучше выбрать и почему.

В планах посмотреть о B-tree индексах на примере PostgreSQL.
🔥9
Всем привет!

Не очень давно рассказывала здесь, что начала бесплатный интенсив. Села тут как-то выполнить первое домашнее задание. Сделать нужно было пару аспектов, подключить базу данных и пару эндпоинтов для сохранения и просмотра данных.

Сделала аспекты, думаю, для базы данных нужна Liquibase, куда же без нее. Сделала под нее модуль. Потом думаю, нужны контроллеры, а я как раз хотела применить OpenApi generator.

Это такой подход, при котором наши контроллеры реализуют сгенерированные интерфейсы, где уже указана swagger документация, указано, что приходит на вход и, что ожидается на выход.

Для тех, кто еще не знает как и кому интересно было бы попробовать такой подход, вот есть хороший туториал. Нужно заполнить специальный yaml файл, в котором можно прописать все необходимое (название метода, интерфейса, дто и какие поля в него нужны и, что у нас обязательно на вход по эндпоинту, а что нет).

Не сразу получилось настроить (не находился нужный плагин в Maven), но вчера нашла свою ошибку, исправила, все подключилось.

Второе домашнее задание включало написать эндпоинты для таск-трекера, а у меня уже и так 2 таск-трекера есть на гитхабе. И тут я вспомнила про свой проект, в котором я хотела импортировать свои закладки из браузера, разделить их по категориям для эффективного поиска. Тут же вспомнила, что я хотела еще дергать API искусственного интеллекта для категоризации и использовать Elasticsearch для поиска.

И тут приняла решение переключиться на это, а не продолжать участвовать в интенсиве. Все-таки там интенсив с возможностью дальнейшего трудоустройства, а я не собираюсь пока менять работу, потому что меня все более, чем устраивает на моем проекте.
👍8🔥6
Всем привет!

На прошлой неделе начала проходить два курса по kubernetes.👩‍💻 Один из них видео-курс от очень хорошего девопс-специалиста на английском, второй мне посоветовали на Stepik (на русском), его начала вчера/позавчера и пока нравится тоже. Советую 👍

Еще записалась на два хакатона, один будет проходить 2 недели в майские праздники, а второй в выходные 17-19 мая. До этого никогда в них не участвовала, думаю, что будет сложно и интересно)
🔥13
Всем привет!

26 апреля начался хакатон, в котором я хотела принять участие. Для меня первый хакатон прошёл, как первый блин комом. Второй, в котором думала принять участие с 17 по 19 мая, я скорее всего "отдам знакомым" 🫣

Продолжаю изучать kubernetes и углубляться в паттерны. Кстати, по паттернам снова вернулась к книжке от Head First. Другая, про которую здесь писала, оказалась даже с неточностями на грани ошибок.

На работе сегодня наконец доделала задачу, которую делала больше недели, в результате получилось больше 1000 строк кода и изменения в 3х репозиториях.

А у вас как проходят выходные, что интересного происходит? 🤗
🔥12
Всем привет и с праздником!

Сегодня хочу рассказать про рабочие моменты и интересный опыт на днях.

У нас команда относительно недавно собралась и ещё доформировывается, например, скоро придут ещё два мидл разработчика.

Сначала не было ощущения работы в команде, в основном мало с кем приходилось взаимодействовать, но незаметно для себя недавно ощутила, что появилась сплоченность и уже не так боязно обращаться к кому-то с вопросом, главное, как я поняла на опыте, идти к человеку, который "в теме".

Например, был у меня неожиданный баг от Maven, в терминале команды mvn clean install проходили успешно, но при этом не подтягивалась нужная мне зависимость. Оказалось, что если делать через терминал такую команду, то по умолчанию настройки settings.xml брались из папки мавен, а не указанный мной файл в другом месте. А если запустить эти же команды через вкладку справа в идее, то подцепляется кастомный файл с настройками.

Помог мне с этим разобраться наш технический специалист, с вопросами по бизнес логике уже другой. По кодстайлу есть ещё один крутой специалист, который одну из моих первых задач на этом проекте разнес в пух и прах (с предложениями как можно лучше на очень продвинутом уровне).

И так получилось, что на днях, вчера /позавчера, я посмотрела его МР (у нас поощряется взаимный код-ревью) и увидела, что у него в одном месте нарушается недавно принятое решение, как делать в схожих случаях. Набравшись храбрости, оставила ему комментарий и он хорошо его принял и сделал исправление.

Правда после этого он проревьюил 3 моих мелких задачи, но пока без замечаний.😅
👍9🔥5😁1🎉1
Всем привет!

Хотели ли вы подключить GitHub Actions также сильно, как я? 🤓

Вчера вооружившись гуглом и помощью ИИ начала пробовать. И сегодня, когда, наконец, все получилось, напишу здесь небольшой гайд, как это можно повторить.

Цель: сделать проверку по чекстайлу, развернуть приложение с базой данных через docker compose файл и запустить тесты postman.

Шаг 1: Подключаем чекстайл.

Подключаем зависимость на maven-checkstyle-plugin последней версии.

Вот так может выглядеть настройка плагина в pom.xml в теге plugins (немного сдвину теги для удобочитаемости в телеграм):

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>${maven-checkstyle.version}</version>
<configuration>
<configLocation>../checkstyle.xml</configLocation>
<failOnViolation>true</failOnViolation>
<logViolationsToConsole>true</logViolationsToConsole>
<includeTestSourceDirectory>true</includeTestSourceDirectory>
</configuration>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
<phase>compile</phase>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>com.puppycrawl.tools</groupId>
<artifactId>checkstyle</artifactId>
<version>${puppycrawl.version}</version>
</dependency>
</dependencies>
</plugin>


Заводим файл checkstyle.xml, я взяла гугловский с разными проверками, в том числе на java doc.

Шаг 2: Пишем Dockerfile и docker-compose.yml

Dockerfile у меня был самый простой, где просто подключается java 21 и копируется джарник в папку контейнера.

FROM amazoncorretto:21
COPY target/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]


На докер-композ файл для краткости даю ссылку.

Так как у меня этот проект относительно старенький, в нем Liquibase запускается вместе с приложением, не в отдельном модуле. Поэтому в докер-композ я делаю для базы данных проверку на ее готовность принимать запросы, и только после этого запускаю сервис-приложение.

Шаг 3: пишем инструкции для GitHub Actions.

Сам файл здесь.

Что там прописано: настройка, когда будет запускаться проверка - я выбрала по пушу и пулл-реквесту в мейн ветку.

Далее шаги установки 21 джавы, мавен, запуск билда проекта, чекстайл проверки, поднимается докер и запускается постман коллекция.

Последнее далось всего сложнее, помог этот гайд.
🔥16
Всем привет!

Мне тут на работе на прошлой неделе вернулась сложная задача, которую первый раз делала 2 месяца назад. Тогда ее отправили на доработку к аналитикам.

Вчера у меня была вторая попытка ее закрыть, отправила на ревью, но один из сеньоров не пропустил такое решение. Созванивались с ним, обсуждая, что он хочет видеть.

В процессе он показал мне суперкласс при составлении спецификации (Specification) для динамического поиска в базе данных. Такое я ни за что бы не написала без гугла, а он сориентировался очень быстро, со словами: "хм, как интересно они придумали".

Я только после созвона разобрала со скрина, что делает код, но до сих пор не совсем осознала, как это вкупе с другим работает)

Ещё 2 месяца назад не знала, что можно искать в базе данных парами в условии, например, так:

Select u.* from users u where (u.name, u.email) in (("name", "email" ), ("name2", "email2"));

Это убирает ненастоящие совпадения и оптимизирует запрос, в сравнении, например, со сгенерированным запросом по названию метода, который мог бы называться по этому примеру как-нибудь в стиле findAllByNameInAndEmailIn. Запрос во втором случае выглядел бы примерно так:

Select u.* from users u where u.name in :names and u.email in :emails;

Вот в этой сфере запрос нужно было сделать в коде и по правильному, чтобы сгенерировал Hibernate.

Потом он ещё меня озадачил на рефакторинг моего подхода в более общем плане, сегодня просидела над этим до 9 вечера, только уже домашние напомнили, что вообще-то уже пора отдыхать) Очень хочется эту задачу поскорее закрыть))
🔥10👍6❤‍🔥1👏1
Всем привет!

С последнего поста сделала несколько интересных экспериментов - развернула локально ИИ, обращалась к нему по API и развернула небольшой пет-проект в кубернетес.

Про локальный ИИ ещё увидела на одной конференции месяц назад, спикера тогда немного подвел заряд ноутбука, но в целом идея понятна. (Кстати, следующий после этого доклад про ИИ был просто огонь.)

Кубернетес разворачивала локально с помощью Minikube, если интересно здесь есть файлы с прописанными настройками для базы данных и приложения. Единственное, не написала пока Readme с командами для запуска. Это в моем todo листе))

Планирую потом, в рамках бесплатного пользования на какой-то ограниченный срок, попробовать развернуть приложение в настоящем kubernetes кластере через яндекс cloud. Как-то попалось, что там есть такая возможность.

А завтра я, внезапно, собираюсь на оффлайн конференцию для питонистов. Потом поделюсь впечатлениями👩‍💻
🔥12
Всем привет!

Сегодня была на Pytup конференции. Очень понравилось, была классная атмосфера, общение с интересными людьми.

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

Так, познакомилась с несколькими интересными людьми, с одной девушкой с крутыми знаниями обсуждали необычную охоту за багами и забавные случаи из жизни, с ними связанные, с другим разработчиком обсуждали Кафку и случаи, когда кому-то может понадобится писать свою кафку, как упомянул первый спикер, что у них на работе они написали / пишут свою кафку.

Трансляция в общем доступе по ссылке, хоть и не совсем на тему джавы, но доклад на тему CI/CD мне показался очень полезным, и также доклад с практической частью и подключением к яндекс cloud тоже понравился, планирую воспроизвести на джаве что-нибудь похожее.

P. S. На трансляции я даже иногда попадала в кадр, но фото с конференции обещают через неделю 😊
🔥9👍2🎉1
Всем привет!

На днях наткнулась на интересное решение и хочу им поделиться.

Например, мы имеем список объектов, условно счетов (InvoiceDto), собранных из разных таблиц базы данных.

Поэтому это Дто имеет у нас 15 полей - наименование, номер счета, дату выставления, дату оплаты, сумму и т.п.

Мы этот список счетов хотим выгрузить в Excel, но особенность в том, что фронт-енд нам присылает названия колонок, которые пользователь выбрал и хочет выгрузить. Ему нужны может 3 поля из дто, а не все 15.

Проблема:

В каждой колонке свои данные, как узнать, какие колонки к нам пришли и какое значение нужно заполнить?

Первая моя мысль: switch case. Типа, идем по колонкам и смотрим, если это наименование - записываем invoice.getName, если сумма - записываем invoice.getAmount, и так 15 кейсов.

Минусы: решение громоздкое, плохо поддерживаемое, напрашивается на баги, плюс многие чекстайл проверки даже не пропустят больше 7 кейсов в одном switch.

Вторая мысль: написать интерфейс с одним методом и как-то определить в зависимости от колонки нужное действие.

Такого типа решение я и нашла: написать мапу, ключом которой будет название колонки, а значением функциональный интерфейс Function, принимающий один объект и возвращающий другой.

Map<String, Function<InvoiceDto, Object>> map = new HashMap<>();

Заполняется:

map.put("nameColumn", InvoiceDto::getName());

В коде это выглядит примерно так:

for (String column : columns) {

Function<InvoiceDto, Object> function = map.get(column)

if (function != null) {

Object value = function.apply(dto);
//далее записываем в ячейки и т.д.

Таким образом, мы избавляемся от проверок, какая колонка к нам пришла и сразу записываем именно то поле, которое требуется.
👍9🔥5
Всем привет!

Не прошло и 2 месяца (позавчера прошло), как я, наконец, прошла видео-курс по Кубернетесу, который длился целых 3 часа 36 минут. 😁

На степике курс тоже почти прошла (осталась одна тема), он в плане объяснения теории очень слабый. Скорее ходила туда закрепить тему с отрывка видео. Отдельно его будет мало, мне кажется. Ссылки на эти курсы оставляла ранее.

Теперь можно смело сказать, что я знаю некоторые определения что есть что в кубернетес и некоторые команды, скрипты настроек. Думаю, как закончу курс со степика, не буду глубже погружаться в K8s пока.

В процессе изучения / чтения у меня сейчас идет книга с паттернами и "кабанчик" ( Kleppmann "Designing Data-Intensive Applications"), его начала читать, чтобы потом просмотреть серию выпусков на ютюбе "Читаем кабанчика".

С моей скоростью просмотра видео, я вряд ли успею просмотреть к 18 июня предыдущие обсуждения (18 июня будет обсуждение 7 главы), но может к июлю что-то и изменится :)
🔥7😁3
Всем привет!

Недавно видела пост про различие между мидлом и сеньором, джуном и мидлом. Мне очень понравились мысли автора.

В последнее время до меня постепенно стала доходить мысль, что джуна от мидла не отличает количественный фактор - сколько инструментов знает / использовал один и другой.

Кажется, что может быть ситуация, в которой джун может ради резюме, как например я, написать несколько проектов с кучей разных инструментов и среди них найдётся сколько-то, которые по каким-то причинам какой-нибудь крепкий мидл не использовал, и это не делает джуна мидлом.

А причина в том, что инструменты осваиваются быстрее, чем растет уверенность, самостоятельность, качество кода и умение справляться с неопределённостью в задачах.

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

Вспомнила, что хотела недавно пройти курс на сеньора, там было в программе за пару месяцев осваиваешь Kubernetes, CI/CD и что-то ещё и вот ты сеньор. Но на самом деле, не все так просто)

На самом деле, и чтобы стать мидлом нужно сначала пару лет поработать, учась у старших коллег.
🔥10💯32
Всем привет!

11 дней 😱 у моего провайдера сложности в нашем районе и я сижу на мобильном интернете, с грустью смотря на все свои отложенные видео с различными непросмотренными лекциями и докладами..

Одними из таких видео, меня ждет курс по Котлин на Степике. Возможно он был у меня в рекомендованных, от этого автора я проходила в том году курс для джавистов - "подготовка к собеседованиям".

Его объяснения у меня хорошо откладываются и курс по котлину тоже шёл бодро, но с мобильным интернетом приходится временно его поставить на паузу.

На самом деле, котлин мне пока не нужен, но есть любопытство посмотреть на отличия с Java, а этот автор как раз и рассказывает сравнивая "так мы делаем в джава, в котлин мы можем это сделать вот так", такого плана.

Во вторник у нас на проекте будет переход на джаву 21 и последнюю версию Spring Boot. Это хотели сделать ещё весной, но по разным обстоятельствам, пришлось отложить.

У нас в пятницу была презентация по этому поводу, обсуждали виртуальные потоки и разные фишки, относящиеся к синтаксическому сахару, 21 джавы. В общем, очень жду, а то у нас пока ещё 11 версия.
🔥10👍2