0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>1 апреля автотесты Хекслета к моему<a>"Менеджеру задач"</a>, по сути дипломному проекту профессии "<a>PHP-разработчик</a>", успешно прошли, и в профиле появилась долгожданная и радующая глаз метка "Закончена" напротив профессии PHP.</p>
1
<p>1 апреля автотесты Хекслета к моему<a>"Менеджеру задач"</a>, по сути дипломному проекту профессии "<a>PHP-разработчик</a>", успешно прошли, и в профиле появилась долгожданная и радующая глаз метка "Закончена" напротив профессии PHP.</p>
2
<p>В апреле по семейным обстоятельствам мне пришлось львиную часть времени проводить с близкими, на программирование оставалось часа полтора в день. Что, кстати, положительно сказалось на длинной дистанции - все-таки уровень "горящих глаз" не удается поддерживать при занятиях от шести часов каждый день на протяжении более двух месяцев. Эти полтора часа я посвящал прохождению первого модуля профессии "<a>Фронтенд-разработчик</a>". Даже смог успешно выполнить первый ее проект "Игры разума" и удивился, насколько легко это далось по сравнению с аналогичным проектом в PHP, который я делал в августе прошлого года.</p>
2
<p>В апреле по семейным обстоятельствам мне пришлось львиную часть времени проводить с близкими, на программирование оставалось часа полтора в день. Что, кстати, положительно сказалось на длинной дистанции - все-таки уровень "горящих глаз" не удается поддерживать при занятиях от шести часов каждый день на протяжении более двух месяцев. Эти полтора часа я посвящал прохождению первого модуля профессии "<a>Фронтенд-разработчик</a>". Даже смог успешно выполнить первый ее проект "Игры разума" и удивился, насколько легко это далось по сравнению с аналогичным проектом в PHP, который я делал в августе прошлого года.</p>
3
<p>В конце апреля обстоятельства вновь изменились, и я снова смог посвящать программированию столько времени, сколько мне вздумается :) Могу себе позволить, как говорится. В планах было выходить на рынок труда, однако первые пару недель я отдал под закрепление слегка заржавевших за месяц неиспользования навыков. Сначала сделал локализацию для своего "Менеджера задач" (русский и английский языки). Потом решил сделать какое-то тестовое задание из<a>специального репозитория Хекслета</a>, в который реальные компании добавляют свои задания для кандидатов.</p>
3
<p>В конце апреля обстоятельства вновь изменились, и я снова смог посвящать программированию столько времени, сколько мне вздумается :) Могу себе позволить, как говорится. В планах было выходить на рынок труда, однако первые пару недель я отдал под закрепление слегка заржавевших за месяц неиспользования навыков. Сначала сделал локализацию для своего "Менеджера задач" (русский и английский языки). Потом решил сделать какое-то тестовое задание из<a>специального репозитория Хекслета</a>, в который реальные компании добавляют свои задания для кандидатов.</p>
4
<p>Выбрал<a>задание от Hicaliber</a>, которое, с одной стороны, показалось довольно небольшим и компактным. А с другой - позволяло прокачать навык работы с API, который на самом деле слабовато представлен в пройденной программе на Хекслете (на заметку составителям курса). Чувствовал, что "плаваю" в этой теме. Что ж, решено - сделано. Разобрался с этой темой основательно, Postman стал моим лучшим другом, API в соответствии с заданием построен и даже снабжен документацией OpenAPI и покрыт тестами.</p>
4
<p>Выбрал<a>задание от Hicaliber</a>, которое, с одной стороны, показалось довольно небольшим и компактным. А с другой - позволяло прокачать навык работы с API, который на самом деле слабовато представлен в пройденной программе на Хекслете (на заметку составителям курса). Чувствовал, что "плаваю" в этой теме. Что ж, решено - сделано. Разобрался с этой темой основательно, Postman стал моим лучшим другом, API в соответствии с заданием построен и даже снабжен документацией OpenAPI и покрыт тестами.</p>
5
<p>И тут я замечаю, что в задании есть вторая часть - динамическая страница на<strong>Vue.js</strong>, отправляющая запросы к моему API и на лету рендерящая получаемый ответ. Фронтенд-морда, как говорит один мой знакомый джун. В общем, аппетит приходит во время еды, и я решил, а почему бы, собственно, и нет? И методом гугления, тыка и<em>Stack Overflow</em>вполне себе разобрался в основах<strong>Vue.js</strong>и<a>реализовал поставленную задачу</a>(и даже с бонусом - мой SPA может еще и добавлять новую сущность в БД). Кайфанул от результата нехило, реактивность - это, конечно, круто.</p>
5
<p>И тут я замечаю, что в задании есть вторая часть - динамическая страница на<strong>Vue.js</strong>, отправляющая запросы к моему API и на лету рендерящая получаемый ответ. Фронтенд-морда, как говорит один мой знакомый джун. В общем, аппетит приходит во время еды, и я решил, а почему бы, собственно, и нет? И методом гугления, тыка и<em>Stack Overflow</em>вполне себе разобрался в основах<strong>Vue.js</strong>и<a>реализовал поставленную задачу</a>(и даже с бонусом - мой SPA может еще и добавлять новую сущность в БД). Кайфанул от результата нехило, реактивность - это, конечно, круто.</p>
6
<p>Слегка расстраивало, что в<em>'estimated time'</em>к этому заданию значилось '3 часа', а у меня ушло на это четыре полных дня. Но я понимал, что это нормально, поскольку, во-первых, этой был мой первый практический нырок в построение API и построение SPA на фронтенд-фреймворке. А во-вторых, я сделал заметно больше, чем было в задании.</p>
6
<p>Слегка расстраивало, что в<em>'estimated time'</em>к этому заданию значилось '3 часа', а у меня ушло на это четыре полных дня. Но я понимал, что это нормально, поскольку, во-первых, этой был мой первый практический нырок в построение API и построение SPA на фронтенд-фреймворке. А во-вторых, я сделал заметно больше, чем было в задании.</p>
7
<p>После этого я решил - пора. Сделал себе страницы на всех актуальных площадках по поиску работы (<a>Linkedin</a>- приглашаю всех хекслетчан законнектиться. И начал откликаться на вакансии. Реакции в основном не было. Я понимал, что таких, как я - десятки, с типовыми учебными проектами с курсов. Чтобы как-то выделиться на их фоне, нужно самостоятельно запилить что-то более-менее масштабное.</p>
7
<p>После этого я решил - пора. Сделал себе страницы на всех актуальных площадках по поиску работы (<a>Linkedin</a>- приглашаю всех хекслетчан законнектиться. И начал откликаться на вакансии. Реакции в основном не было. Я понимал, что таких, как я - десятки, с типовыми учебными проектами с курсов. Чтобы как-то выделиться на их фоне, нужно самостоятельно запилить что-то более-менее масштабное.</p>
8
<p>Еще раз прошерстил репо тестовых заданий по ключевому слову 'Laravel' (мой главный рабочий инструмент), и остановился на показавшемся самым трудным -<a>интернет-магазин</a>, задачка от компании 'House'.</p>
8
<p>Еще раз прошерстил репо тестовых заданий по ключевому слову 'Laravel' (мой главный рабочий инструмент), и остановился на показавшемся самым трудным -<a>интернет-магазин</a>, задачка от компании 'House'.</p>
9
<p>Работа над этим проектом, названным<strong>'Manul shop'</strong>в честь любимого животного дочки, заняла у меня три недели. По сути, можно рассматривать как пятый учебный проект на Хекслете :) Делал я все, как представляется, весьма основательно. Все контроллеры API я обильно покрывал тестами, причем дополнительно проверял (с помощью сторонней библиотеки) возвращаемый ответ на соответствие файлу дефиниций<em>OpenAPI.yaml</em>, также самостоятельно написанному. Получил удовольствие от того, что написание тестов вошло у меня в рутину, и, хоть и отнимало солидное количество времени, на дистанции, безусловно, окупалось.</p>
9
<p>Работа над этим проектом, названным<strong>'Manul shop'</strong>в честь любимого животного дочки, заняла у меня три недели. По сути, можно рассматривать как пятый учебный проект на Хекслете :) Делал я все, как представляется, весьма основательно. Все контроллеры API я обильно покрывал тестами, причем дополнительно проверял (с помощью сторонней библиотеки) возвращаемый ответ на соответствие файлу дефиниций<em>OpenAPI.yaml</em>, также самостоятельно написанному. Получил удовольствие от того, что написание тестов вошло у меня в рутину, и, хоть и отнимало солидное количество времени, на дистанции, безусловно, окупалось.</p>
10
<p>К концу работы над проектом выполнение команды<em>'make test'</em>стало занимать более минуты, общее покрытие тестами составляет 92% (причем б<strong>о</strong>льшая часть остатка - это непротестированные почему-то встроенные модули<em>Laravel</em>). Сейчас в проекте 129 тестов с 634 assertions. Солидные цифры, правда? И есть что-то медитативное в наблюдении за бегущими вверх строчками с зеленым значком "PASS".</p>
10
<p>К концу работы над проектом выполнение команды<em>'make test'</em>стало занимать более минуты, общее покрытие тестами составляет 92% (причем б<strong>о</strong>льшая часть остатка - это непротестированные почему-то встроенные модули<em>Laravel</em>). Сейчас в проекте 129 тестов с 634 assertions. Солидные цифры, правда? И есть что-то медитативное в наблюдении за бегущими вверх строчками с зеленым значком "PASS".</p>
11
<p>Впрочем, писать тесты<em>'in advance'</em>впрок я не научился. Обычно это выглядит так (пример для тестов к API как более сложных): сначала пишу экшен к контроллеру, обрабатывающему запрос к какому-то эндпойнту, потом отправляю через<em>Postman</em>на него запрос и смотрю, приходит ли ожидаемый ответ. После этого добавляю в файл OpenAPI.yaml описание соответствующего пути, возможных ответов и схему возвращаемого объекта и пишу уже на основе этого тесты, с учетом всех возможных сценариев.</p>
11
<p>Впрочем, писать тесты<em>'in advance'</em>впрок я не научился. Обычно это выглядит так (пример для тестов к API как более сложных): сначала пишу экшен к контроллеру, обрабатывающему запрос к какому-то эндпойнту, потом отправляю через<em>Postman</em>на него запрос и смотрю, приходит ли ожидаемый ответ. После этого добавляю в файл OpenAPI.yaml описание соответствующего пути, возможных ответов и схему возвращаемого объекта и пишу уже на основе этого тесты, с учетом всех возможных сценариев.</p>
12
<p>Из новых технологий, которые пришлось освоить:</p>
12
<p>Из новых технологий, которые пришлось освоить:</p>
13
<ul><li>Авторизация запросов к API, основанная на выдаче токенов (<em>Laravel Sanctum</em>)</li>
13
<ul><li>Авторизация запросов к API, основанная на выдаче токенов (<em>Laravel Sanctum</em>)</li>
14
<li>Установка ролей и разрешений на определённые действия (сторонняя библиотека)</li>
14
<li>Установка ролей и разрешений на определённые действия (сторонняя библиотека)</li>
15
<li>Работа с корзиной, сохраняющей в сессию выбранные товары (сторонняя библиотека)</li>
15
<li>Работа с корзиной, сохраняющей в сессию выбранные товары (сторонняя библиотека)</li>
16
<li>Работа с файловым хранилищем на сервере (возможность для юзеров-админов загружать/удалять изображения)</li>
16
<li>Работа с файловым хранилищем на сервере (возможность для юзеров-админов загружать/удалять изображения)</li>
17
<li>Vue Router.</li>
17
<li>Vue Router.</li>
18
</ul><p>Настроенный со старта проекта CI/CD (Github Actions), мгновенно деплоящий каждый коммит на хостинг, вошел уже в привычку - спасибо Хекслету за воспитание хороших манер :)</p>
18
</ul><p>Настроенный со старта проекта CI/CD (Github Actions), мгновенно деплоящий каждый коммит на хостинг, вошел уже в привычку - спасибо Хекслету за воспитание хороших манер :)</p>
19
<p>Вот, кстати, результат проделанной работы -<a>manul-shop-production.up.railway.app</a>. За каждый найденный баг - с меня пиво при личной встрече (район обитания - Бишкек-Алматы). Зайти под админом и получить доступ к функционалу управления контентом магазина можно так: email -<em>'a@a'</em>, пароль -<em>'aaaaaa'</em>. Хоть в верстке я и не особо, но в целом, по-моему, получилось приемлемо с точки зрения дизайна. В целом мне понравилось ковыряться со стилями CSS, настраивая все эти аккордеоны и дропдауны, тем более что пользуясь<a>темами Bootswatch</a>делать это - проще пареной репы. В итоге даже на экранах смартфонов сайт смотрится более-менее.</p>
19
<p>Вот, кстати, результат проделанной работы -<a>manul-shop-production.up.railway.app</a>. За каждый найденный баг - с меня пиво при личной встрече (район обитания - Бишкек-Алматы). Зайти под админом и получить доступ к функционалу управления контентом магазина можно так: email -<em>'a@a'</em>, пароль -<em>'aaaaaa'</em>. Хоть в верстке я и не особо, но в целом, по-моему, получилось приемлемо с точки зрения дизайна. В целом мне понравилось ковыряться со стилями CSS, настраивая все эти аккордеоны и дропдауны, тем более что пользуясь<a>темами Bootswatch</a>делать это - проще пареной репы. В итоге даже на экранах смартфонов сайт смотрится более-менее.</p>
20
<p>Одновременно с началом работы над<strong>Manul Shop</strong>я начал пользоваться<strong>ChatGPT</strong>. И, конечно, он стал очень ценным помощником, экономящим кучу времени. Причем я бы не сказал, что он сделал какую-то важную часть работы за меня, и что я как бы читерствовал. Все архитектурные, комплексные решения я принимал сам, к чат-боту обращался лишь для быстрого поиска ответа на какой-то небольшой локальный технический вопрос, как сделать то-то. Ранее я бы для этого использовал гугление, и правильное решение было бы найдено минут за 20-30. Сейчас же это занимает одну-две минуты (в сложных случаях до 10).</p>
20
<p>Одновременно с началом работы над<strong>Manul Shop</strong>я начал пользоваться<strong>ChatGPT</strong>. И, конечно, он стал очень ценным помощником, экономящим кучу времени. Причем я бы не сказал, что он сделал какую-то важную часть работы за меня, и что я как бы читерствовал. Все архитектурные, комплексные решения я принимал сам, к чат-боту обращался лишь для быстрого поиска ответа на какой-то небольшой локальный технический вопрос, как сделать то-то. Ранее я бы для этого использовал гугление, и правильное решение было бы найдено минут за 20-30. Сейчас же это занимает одну-две минуты (в сложных случаях до 10).</p>
21
<p>Подводя итог - результатом проделанной работы доволен. В начале июня зарелизил готовое веб-приложение, дополнил им резюме и пошел на второй виток активного поиска работы. Прям почувствовал положительные изменения в интересе работодателей - уже получил четыре отклика с приглашением к первому этапу отбора. Правда, два из них из сомнительных маленьких шаражек. А другие два выслали тестовые задания - и я их сделал буквально за вечер каждое (<a>раз</a>,<a>два</a>, зайти под<em>'a@a'</em>, пароль -<em>'a'</em>), и получил оценку "отлично" (потом, правда, застопорилось. Видимо, другие кандидаты тоже справились и по другим параметрам были оценены выше). Но после моего интернет-магазина типовые тестовые для джунов на Laravel - семечки :)</p>
21
<p>Подводя итог - результатом проделанной работы доволен. В начале июня зарелизил готовое веб-приложение, дополнил им резюме и пошел на второй виток активного поиска работы. Прям почувствовал положительные изменения в интересе работодателей - уже получил четыре отклика с приглашением к первому этапу отбора. Правда, два из них из сомнительных маленьких шаражек. А другие два выслали тестовые задания - и я их сделал буквально за вечер каждое (<a>раз</a>,<a>два</a>, зайти под<em>'a@a'</em>, пароль -<em>'a'</em>), и получил оценку "отлично" (потом, правда, застопорилось. Видимо, другие кандидаты тоже справились и по другим параметрам были оценены выше). Но после моего интернет-магазина типовые тестовые для джунов на Laravel - семечки :)</p>