@krautkraft

Java junior, серверное ПО, какие задачи решать, чтоб понять устройство системы?

Добрый день!
Прошу вашего профессионального совета по поводу дальнейшего направления развития.

Студент 4 курса, специальность - прикладная математика и информатика. Компьютерные дисциплины практически не преподавались, учил сам. Работал в техподдержке вуза, параллельно учил основы linux и сетей, плюс Java - с нуля, писал простые учебные программы.
Сейчас я джун в отделе, занимающемся развертыванием ПО на серверах распределенной системы, администрированием БД Postgres. Немного своего ПО пишем на Spring.

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

Дают изучать полезные вещи: Spring микросервисы, инструменты для работы с распределенными системами (Kafka, Zookeeper), Elasticsearch и ELK-стек, Spring JPA, репликация БД. Получается пока на уровне туториалов и quick start-ов. До прода далеко.

Свой код плохой, на досуге стараюсь решать задачки на базовые алгоритмы (Керниган, Пайк “Практика программирования”).
Высокоуровневые Java-фреймворки и интуитивно понятный API кажутся простыми на фоне C и рекурсии, вводят в заблуждение. Трудно докопаться до сути и понять, как связаны, скажем, ядро и драйвера с абстракциями и обертками.
Поэтому когда дело доходит до реальной задачи - все рушится из-за отсутствия понимания базовых вещей.

Моя цель - писать хороший код для серьезных задач, разобраться, как все устроено изнутри.

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

Заранее спасибо.
  • Вопрос задан
  • 351 просмотр
Решения вопроса 1
@Asapin
В свободное время ковыряюсь с Rust и Wasm
Если уже есть небольшой опыт работы со спрингом, то советую посмотреть "Spring-потрошитель" (2 части) от Евгения Борисова на ютубе. Он хорошо объяснил как спринг устроен изнутри. Магии много, на разобраться можно.

После этого можно начинать читать документацию по интересующим модулям спринга. Она обычно очень подробная и понятная. Вот например документация по Spring Jpa.

После этого попробуйте с нуля написать какое-нибудь простое приложение на спринге не используя туториалы, quick-старты и spring initializr, только maven/gradle (смотря что у вас в команде используется) и документация. Скажем, 3 пользовательских роли (админ, пользователь, аноним), 3 эндпоинта: 1 доступен для всех, 1 доступен админу и пользователю, 1 доступен только админу. Для начала пользователей можно захардкодить. Потом прикрутить постгрес для их хранения, потом прикрутить эластик для логов и т.п.
После этого добавить несколько тестов, причём как тестов, которые напрямую дёргают методы сервисов и репозиториев, так и тесты, которые эмулируют пользователя: отправляют http-запросы на вход в систему, а потом дёргают эндпоинты и проверяют, что ограничения эндпоинтов по ролям работают правильно.

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

За пару недель не спеша сделать вполне реально. После этого, если есть возможность, попросите кого-нибудь более опытного посмотреть код и сказать, что и как стоит исправить, желательно с пояснением почему.

Понимание рекурсии и базовых алгоритмов полезно, но в корпоративном сегменте это будет встречаться не часто: бизнес процессы в большинстве случаев будут расписаны либо бизнес-аналитиком, либо самим заказчиком, а большинство структур данных и алгоритмов работы с ними уже доступны в стандартной библиотеке, Apache Commons Lang 3 и Google Guava.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
saboteur_kiev
@saboteur_kiev Куратор тега Карьера в IT
software engineer
Хороший код приходит с опытом, проблематично целенаправленно учиться писать хороший код, это все равно как целенаправленно учить опыт.
В этом плане нужно просто понимать почему что делается.

А так - направление это совместная работа. Понимать весь цикл разработки. Как предсказуемо оценивать сроки задачи, как их правильно дробить, как взаимодействовать с другими разработчиками или командами.
Все инструменты, с которыми сталкиваешься - старайся добиться, чтобы работало, потом интересуйся как это работает. Таже кафка - что она вообще умеет. Тот же ELK стек - можно научиться парсить логи чтобы искать нужные вещи, а можно в самом приложении поправить логгер, чтобы он в ЕЛК отправлял более удобные для парсинга данные. И так с каждым сервисом/технологией - ты как разработчик и со стороны приложения можешь менять и со стороны сервиса можешь смотреть что от него взять можно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы