1 апреля автотесты Хекслета к моему «Менеджеру задач», по сути дипломному проекту профессии «PHP-разработчик», успешно прошли, и в профиле появилась долгожданная и радующая глаз метка «Закончена» напротив профессии PHP.
В апреле по семейным обстоятельствам мне пришлось львиную часть времени проводить с близкими, на программирование оставалось часа полтора в день. Что, кстати, положительно сказалось на длинной дистанции — все-таки уровень «горящих глаз» не удается поддерживать при занятиях от шести часов каждый день на протяжении более двух месяцев. Эти полтора часа я посвящал прохождению первого модуля профессии «Фронтенд-разработчик». Даже смог успешно выполнить первый ее проект «Игры разума» и удивился, насколько легко это далось по сравнению с аналогичным проектом в PHP, который я делал в августе прошлого года.
В конце апреля обстоятельства вновь изменились, и я снова смог посвящать программированию столько времени, сколько мне вздумается :) Могу себе позволить, как говорится. В планах было выходить на рынок труда, однако первые пару недель я отдал под закрепление слегка заржавевших за месяц неиспользования навыков. Сначала сделал локализацию для своего «Менеджера задач» (русский и английский языки). Потом решил сделать какое-то тестовое задание из специального репозитория Хекслета, в который реальные компании добавляют свои задания для кандидатов.
Выбрал задание от Hicaliber, которое, с одной стороны, показалось довольно небольшим и компактным. А с другой — позволяло прокачать навык работы с API, который на самом деле слабовато представлен в пройденной программе на Хекслете (на заметку составителям курса). Чувствовал, что «плаваю» в этой теме. Что ж, решено — сделано. Разобрался с этой темой основательно, Postman стал моим лучшим другом, API в соответствии с заданием построен и даже снабжен документацией OpenAPI и покрыт тестами.
И тут я замечаю, что в задании есть вторая часть — динамическая страница на Vue.js, отправляющая запросы к моему API и на лету рендерящая получаемый ответ. Фронтенд-морда, как говорит один мой знакомый джун. В общем, аппетит приходит во время еды, и я решил, а почему бы, собственно, и нет? И методом гугления, тыка и Stack Overflow вполне себе разобрался в основах Vue.js и реализовал поставленную задачу (и даже с бонусом — мой SPA может еще и добавлять новую сущность в БД). Кайфанул от результата нехило, реактивность — это, конечно, круто.
Слегка расстраивало, что в 'estimated time' к этому заданию значилось '3 часа', а у меня ушло на это четыре полных дня. Но я понимал, что это нормально, поскольку, во-первых, этой был мой первый практический нырок в построение API и построение SPA на фронтенд-фреймворке. А во-вторых, я сделал заметно больше, чем было в задании.
После этого я решил — пора. Сделал себе страницы на всех актуальных площадках по поиску работы (Linkedin — приглашаю всех хекслетчан законнектиться. И начал откликаться на вакансии. Реакции в основном не было. Я понимал, что таких, как я — десятки, с типовыми учебными проектами с курсов. Чтобы как-то выделиться на их фоне, нужно самостоятельно запилить что-то более-менее масштабное.
Еще раз прошерстил репо тестовых заданий по ключевому слову 'Laravel' (мой главный рабочий инструмент), и остановился на показавшемся самым трудным — интернет-магазин, задачка от компании 'House'.
Работа над этим проектом, названным 'Manul shop' в честь любимого животного дочки, заняла у меня три недели. По сути, можно рассматривать как пятый учебный проект на Хекслете :) Делал я все, как представляется, весьма основательно. Все контроллеры API я обильно покрывал тестами, причем дополнительно проверял (с помощью сторонней библиотеки) возвращаемый ответ на соответствие файлу дефиниций OpenAPI.yaml, также самостоятельно написанному. Получил удовольствие от того, что написание тестов вошло у меня в рутину, и, хоть и отнимало солидное количество времени, на дистанции, безусловно, окупалось.
К концу работы над проектом выполнение команды 'make test' стало занимать более минуты, общее покрытие тестами составляет 92% (причем большая часть остатка — это непротестированные почему-то встроенные модули Laravel). Сейчас в проекте 129 тестов с 634 assertions. Солидные цифры, правда? И есть что-то медитативное в наблюдении за бегущими вверх строчками с зеленым значком «PASS».
Впрочем, писать тесты 'in advance' впрок я не научился. Обычно это выглядит так (пример для тестов к API как более сложных): сначала пишу экшен к контроллеру, обрабатывающему запрос к какому-то эндпойнту, потом отправляю через Postman на него запрос и смотрю, приходит ли ожидаемый ответ. После этого добавляю в файл OpenAPI.yaml описание соответствующего пути, возможных ответов и схему возвращаемого объекта и пишу уже на основе этого тесты, с учетом всех возможных сценариев.
Из новых технологий, которые пришлось освоить:
- Авторизация запросов к API, основанная на выдаче токенов (Laravel Sanctum)
- Установка ролей и разрешений на определённые действия (сторонняя библиотека)
- Работа с корзиной, сохраняющей в сессию выбранные товары (сторонняя библиотека)
- Работа с файловым хранилищем на сервере (возможность для юзеров-админов загружать/удалять изображения)
- Vue Router.
Настроенный со старта проекта CI/CD (Github Actions), мгновенно деплоящий каждый коммит на хостинг, вошел уже в привычку — спасибо Хекслету за воспитание хороших манер :)
Вот, кстати, результат проделанной работы — manul-shop-production.up.railway.app. За каждый найденный баг — с меня пиво при личной встрече (район обитания — Бишкек-Алматы). Зайти под админом и получить доступ к функционалу управления контентом магазина можно так: email — 'a@a', пароль — 'aaaaaa'. Хоть в верстке я и не особо, но в целом, по-моему, получилось приемлемо с точки зрения дизайна. В целом мне понравилось ковыряться со стилями CSS, настраивая все эти аккордеоны и дропдауны, тем более что пользуясь темами Bootswatch делать это — проще пареной репы. В итоге даже на экранах смартфонов сайт смотрится более-менее.
Одновременно с началом работы над Manul Shop я начал пользоваться ChatGPT. И, конечно, он стал очень ценным помощником, экономящим кучу времени. Причем я бы не сказал, что он сделал какую-то важную часть работы за меня, и что я как бы читерствовал. Все архитектурные, комплексные решения я принимал сам, к чат-боту обращался лишь для быстрого поиска ответа на какой-то небольшой локальный технический вопрос, как сделать то-то. Ранее я бы для этого использовал гугление, и правильное решение было бы найдено минут за 20-30. Сейчас же это занимает одну-две минуты (в сложных случаях до 10).
Подводя итог — результатом проделанной работы доволен. В начале июня зарелизил готовое веб-приложение, дополнил им резюме и пошел на второй виток активного поиска работы. Прям почувствовал положительные изменения в интересе работодателей — уже получил четыре отклика с приглашением к первому этапу отбора. Правда, два из них из сомнительных маленьких шаражек. А другие два выслали тестовые задания — и я их сделал буквально за вечер каждое (раз, два, зайти под 'a@a', пароль — 'a'), и получил оценку «отлично» (потом, правда, застопорилось. Видимо, другие кандидаты тоже справились и по другим параметрам были оценены выше). Но после моего интернет-магазина типовые тестовые для джунов на Laravel — семечки :)