Код 2015 против 2023

Опубликовано 2023-09-12 12:16:58

Одна компания предложила пройти собеседование и выполнить тестовое задание, которое оказалось таким же, какое выполнял 8 лет назад, когда устраивался в компанию XIAG. В задании требовалось разработать проект для сжатия ссылок.

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

TLDR;

Кода больше, времени потрачено меньше. Код более качественный. Влияют технологии и применение стандартов.

Задание

Задание: разработка проекта для сжатия урлов
Требования:
- Возможность сокращать через веб-форму
- Возможность сокращать через api (json)
- использовать базу данных MariaDB
- нельзя использовать фреймворки
- нельзя использовать композер
- делать по принципу ООП/MVC

Для сложности, можно добавить авторизацию/регистрацию с подтверждением по email

После выполнения, публикуйте на GitHub в открытый репозиторий и пришлите ссылку в ответном письме.

Сравнение тестовых заданий

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

Итак, есть код 1 из 2015 году и код 2 из 2023.

Код 1 - 23 декабря 2015

Код 2 - 11 сентября 2023

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

В коде 1 видно недочёты. В каталоге public (в открытом доступе) лежат файлы, которые определяют логику обработки запроса. Было бы лучше оставить в public только index.php, а redirect.php и urlshortener.php вынести на уровень выше.

Другой момент, который бросается в глаза это использование массивов вместо типизированных объектов. Конфигурация приложения возможна только если изменить код. Код местами выглядит несуразно, например UrlShortenerModel содержит логику работы с генерацией хеша и логику работы с базой данных. UrlShortenerException содержит код error_handler и сам класс UrlShortenerException.

Из позитивного нужно отметить, что код работает и есть инструкция для развертывания проекта. Разворачивание проекта требует установки необходимых программ на рабочий компьютер, вроде веб-сервера и базы данных. Тогда я ещё не знал о docker.

Код путанный, смешанный, но понять можно. Это было второе место работы после junior позиции, наверное middle, middle-.

Сложно сказать чем плох код - 2, потому что это мой текущий уровень понимания. По сравнению с кодом 1, код 2 лучше структурирован: отдельные классы для сервиса, запроса, ответа и модели. Файлы, относящиеся к сокращению ссылок расположены в отдельном каталоге urlshortener, базовые вещи в classes. Приложение конфигурируется через переменные окружения, а доступ к конфигурационным данным хранит класс Config. Класс DBработает с базой данных. В коде 1 я даже не рассматривал ситуацию сетевых проблем, здесь же запросы к бд оборачиваются в вызов Retry::retry. Docker позволяет начать разработку одной командой docker compose up. Создан каталог tests для тестов.

Обсудим потенциальные улучшения в коде 2. Добавить тесты с помощью junit + testcontainers. В задании указана MariaDB, но я бы сделал выбор в пользу NoSQL базы. По сути нужны кэш-инстансы, вроде Redis. Простое хранилище ключ-значение, TTL из коробки и политика удаления протухших записей. При этом Redis умеет периодически записывать данные на диск из коробки и поднимать их после запуска.

Нужно подвести итог и сделать выводы. Хочется верить в то, что код спустя 8 лет стал лучше. Заметно и влияние технологий, и подход в разработке.

Docker сделал развертывание приложения проще. Для старта разработки достаточно заполнить перменные окружения и выполнить одну команду docker compose up. Появление в PHP типизации, синтаксического сахара и новых выражений. Появились стандарты разработки: форматирование, стандарты оформления кода, тесты, конфигурировать приложение через env переменные, писать логи в поток вывода вместо файлов.

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