Niks Kozlovs
Rīga, Latvia
Ф У Л Л С Т Е К РАЗРАБОТЧИК Работа Образование
Сентябрь 2022 - Апрель 2023
Chili Labs Flutter-разработчик
В Chili Labs я занимался разработкой мобильных приложений. Все проекты, над которыми я работал, были написаны на Flutter. Я работал над развлекательными приложениями, например CrochetApp , так и над серьезными финтех-продуктами, такими как Bondora . Также я помогал команде с задачами на других проектах, включая LTAB OCTA .
Рост выручки и разработка фич
Основное время я уделял проекту CrochetApp , где реализовал функционал, который помог удвоить выручку приложения . Я разработал пуш-уведомления, флоу онбординга и различные CTA для подписки, используя Firebase Remote Config и A/B-тестирование , что повысило удержание (retention) и вовлеченность пользователей. Также я добавил возможность загрузки изображений (крючков и пряжи) через AWS S3 , сделав приложение более интерактивным.
Админ-инструменты и работа с данными
Создал надежные инструменты администрирования для контент-менеджеров, включая редактируемые таблицы с валидацией данных. Провел рефакторинг системы материалов: вместо статического JSON-файла внутри приложения настроил динамическую синхронизацию с базой данных, при которой загружаются только измененные значения. Это снизило потребление трафика и ускорило загрузку.
Поддержка и стабильность приложений
Обновил CrochetApp до новейший версии Flutter, устранил поломки и актуализировал зависимости. Отвечал за полный жизненный цикл релиза : публикацию в App Store и Play Store, управление бета-версиями в TestFlight и мониторинг аналитики для контроля стабильности сборок.
Улучшение UI/UX
Переписал фронтенд приложения Bondora на Flutter, реализовав кастомные графики, динамический ввод валют с адаптацией под локаль пользователя, а также детальные экраны (выписки, переключение счетов). Эти улучшения сделали интерфейс приложения более единообразным и удобным для пользователей.
Другие задачи
Исправлял баги в проекте LTAB OCTA , помогал коллегам с QA и отладкой, а также участвовал в код-ревью и обмене знаниями по Firebase, управлению жизненным циклом приложений и лучшую практику.
Май 2019 - Июнь 2020
Scandiweb Full-stack разработчик
В Scandiweb я работал над широким спектром проектов для международных e-commerce брендов. Большую часть времени я занимался разработкой фронтенда на React и его интеграцией с бэкенд-системами (Magento, .NET), но также работал с базами данных.
Ключевой функционал E-commerce
Реализовал страницы товаров (PDP), инструменты сравнения, избранное, корзину, а также полноценную систему промокодов: от обновления схемы MySQL до интеграции с Magento через GraphQL API.
Визуализация данных
Спроектировал и реализовал компоненты статистики (графики, диаграммы), сделав сложные данные наглядными и понятными для пользователей.
Переиспользуемые компоненты и виджеты
Создал библиотеку React-компонентов и виджеты для WYSIWYG-редактора в админ-панели, чтобы владельцы магазинов могли менять структуру страниц и контент без участия разработчиков.
Миграция проектов
Участвовал в переводе старого монолитного .NET приложения на современную архитектуру: .NET (бэкенд) + React (фронтенд). В процессе создавал фронтенд-компоненты и разрабатывал GraphQL эндпоинты.
DevOps и Docker
Использовал Docker на всех проектах для упрощения развертывания и работал стабильно на всех этапах разработки.
Командная работа и процессы
Плотно взаимодействовал с менеджерами продуктов, дизайнерами и QA. Вел задачи в Jira, давал оценки (эстимейты), следовал лучшим практикам и использовал Git в связке с CI и автотестами.
Вклад в команду
Проводил код-ревью, помогал с QA и багфиксингом, а также делился знаниями для профессионального роста команды.
Сентябрь 2020 - Июнь 2024
Латвийский университет Бакалавр компьютерных наук
Обучение на факультете компьютерных наук в ЛУ обеспечило надежный баланс теоретической базы и практических навыков. Программа охватывала множество дисциплин, включая программирование, структуры данных, алгоритмы, базы данных, операционные системы и управление проектами.
Ключевой опыт:
Бакалаврская работа: Разработал мобильное приложение с интеграцией голосового управления, что позволило пользователям взаимодействовать с интерфейсом без рук.
Учебный проект для Latvijas Dzelzceļš: В составе команды работал над симуляцией проекта для Латвийской железной дороги. Работа включала подготовку полной проектной документации, в том числе диаграмм Ганта, планов управления качеством и стратегий управления рисками.
Исследовательские навыки: Развил умение глубоко изучать технические темы и применять полученные теоретические знания для решения реальных задач.
Навыки и достижения:
Программирование и инструменты: Освоил ряд языков программирования и фреймворков, применяя их в лабораторных работах и при написании диплома.
Управление проектами (Project Management): Получил практический опыт планирования, оценки рисков и командного взаимодействия на примерах, приближенных к реальным бизнес-задачам.
Чистый код: Из одного из курсоф углубленно изучал и внедрял принципы чистого кода. Эти стандарты я продолжаю применять как в личных проектах, так и в профессиональной разработке.
Сентябрь 2016 - Июнь 2020
Рижский государственный техникум Профессиональное образование: Техник-программист
За время учебы в Рижском государственном техникуме (RVT) я заложил прочный фундамент как в теории , так и в практике программирования:
Программирование: Научился проектировать алгоритмы, писать и отлаживать код (debugging) на нескольких языках, а также следовать стандартам качественного кода.
Базы данных: Получил практический опыт работы с БД: структурирование данных, написание запросов и создание приложений, взаимодействующих с хранилищами данных.
Веб-разработка: Изучил технологии веб-программирования, создавал сайты и разбирался в принципах клиент-серверного взаимодействия.
Сети и системы: Работал с компьютерными сетями и “железом”, занимался установкой и настройкой ПО, обслуживанием рабочих станций и настройкой локальных сетей.
Освоил методы обеспечения качества ПО: комментирование кода, тестирование, а также основы безопасности и надежности приложений.
Научился подбирать подходящий технический инструментарий для решения задач - от выбора среды разработки до оптимизации существующих решений.
Сочетание теории, лабораторных работ и практических заданий сформировало базу, которую я продолжаю развивать в своей карьере.
Проекты Technodom Full-stack разработка для крупнейшего ритейлера электроники в Казахстане. Вырос от создания UI-компонентов до разработки ключевого бэкенд-функционала (PHP/MySQL) и стейт-логики на React.
Scandiweb React Magento 2 PHP MySQL GraphQL SASS/BEM ScandiPWA
Crochet App Взял на себя разработку этого коммерческого Flutter-приложения, удвоив выручку за счет стратегического A/B-тестирования и разработки кастомной системы оффлайн-синхронизации данных.
Chili Labs Flutter Firebase AWS S3 A/B Testing
TinyEar (Бакалаврская работа) Offline-first библиотека распознавания речи для Android. Я разработал JNI-мост для запуска модели OpenAI Whisper на мобильных устройствах с кастомной оптимизацией энергопотребления.
Android Kotlin C++ (JNI) TensorFlow Lite OpenAI Whisper Machine Learning
Sophie Conran Frontend-разработка для премиум-бренда на базе ScandiPWA и Magento 2. Реализовал кастомные компоненты Headless CMS и сложное поведение UI.
Scandiweb React Magento 2 ScandiPWA GraphQL Headless CMS
RunQuest (Квалификационная работа) Комплексное full-stack мобильное приложение с геймификацией фитнеса. Разработано на Flutter, Node.js и GraphQL в качестве итоговой квалификационной работы.
Flutter Node.js GraphQL MySQL JWT Auth System Architecture Google Maps API
Bondora Go & Grow App Переработка мобильного приложения для инвестиций Bondora с полным редизайном UI/UX на Flutter.
Chili Labs Flutter Android iOS REST API BLoC Unit Tests Graphs
Cervera Миграция устаревшего .NET e-commerce сайта на современное React SPA приложение с участием в разработке как фронтенда, так и бэкенда.
Scandiweb .NET React SCSS/Sass JavaScript MySQL
Atrodi Skolu (Open Data Hackathon) Финалист хакатона Open Data. Геопространственное веб-приложение для визуализации учебных заведений, построенное на нормализации сырых государственных данных.
JavaScript OpenStreetMap Leaflet SQL Open Data
CitySense (LATA Hackathon 2019) Ведущий разработчик приложения для оптимизации общественного транспорта. Мы использовали открытые данные Rīgas Satiksme для прогнозирования загруженности маршрутов
React Laravel GraphQL OpenStreetMap Leaflet Data Engineering
Ace Your Trace (GreenTech 2019 Hackathon) Интерактивное веб-приложение для генерации персонализированных пешеходных маршрутов во время пандемии COVID-19
HTML CSS JS OpenStreetMap Leaflet Directions API
Banking Application Полнофункциональное банковское приложение на Java, демонстрирующее навыки ООП и современные принципы разработки ПО.
Java JavaFX MySQL Docker MVC Architecture
Giphy Search Engine Flutter-приложение с использованием MVVM и Provider для высокопроизводительного поиска изображений.
Flutter Provider MVVM REST API Dart
Technodom Ключевой разработчик (Core developer) высоконагруженной e-commerce платформы (команда 10+ человек). Прошел путь от верстки адаптивных UI-компонентов до архитектуры full-stack фич, таких как "Избранное" и "Сравнение товаров", используя React, GraphQL и Magento 2.
Читать далее
✖
Technodom
Обзор проекта
Technodom ведущий ритейлер электроники в Казахстане. Это был мой первый опыт работы в крупной Agile-команде (10+ разработчиков). Проект был построен на Magento 2 с фронтендом на ScandiPWA (React) . Я прошел путь от выполнения базовых задач по фронтенду до ответственности за full-stack функционал и работы с масштабной кодовой базой.
UI-компоненты и интеграция с CMS
Моя первоначальная работа была сосредоточена на создании переиспользуемых компонентов, управляемых через бэкенд. Я разработал React-компоненты, совместимые с WYSIWYG , что позволило маркетинговой команде редактировать информационные блоки и баннеры напрямую, без привлечения разработчиков.
Я также создал Карточки товаров и Страницы детального просмотра (PDP) . Дизайн требовал сложной логики лейблов (для скидок или новинок) и строгой адаптивности. Я использовал SASS и методологию BEM (БЭМ) для поддержания организованности и чистоты стилей.
Продвинутая логика React: Сравнение товаров
Одной из самых сложных фронтенд-фич, которую я реализовал, стал инструмент сравнения товаров. Он позволял пользователям выбирать несколько позиций и просматривать их характеристики бок-о-бок. Техническим вызовом стало управление состоянием (state management), чтобы выбор пользователя сохранялся даже после перезагрузки страницы.
Full-Stack реализация: Система избранного
Моим самым значимым техническим вкладом стала функция Избранное (Wishlist) . Поскольку эта логика отсутствовала в нашей базовой сборке, мне пришлось выстраивать ее с нуля на всех уровнях стека:
База данных (MySQL): Создал кастомные таблицы для хранения списков желаемого.
Бэкенд (PHP/Magento): Написал логику для обработки этих данных.
API (GraphQL): Реализовал кастомные запросы и мутации (add, remove, fetch).
Фронтенд (React): Подключил UI к этим новым эндпоинтам.
Логика корзины и рекомендации
Я также работал над Корзиной, реализуя расчет цен в реальном времени, удаление товаров и обновление количества. Чтобы способствовать росту продаж, я добавил карусель “Рекомендации товаров” внутри корзины, которая подгружала сопутствующие товары на основе текущего выбора пользователя.
Интеграции и командная работа
Помимо основного функционала, я занимался сторонними интеграциями, например, Подпиской на рассылку . Сложность заключалась в том, что сервис использовал встроенный iframe, который не соответствовал дизайну нашего сайта. Я использовал инъекцию CSS и манипуляции с DOM, чтобы заставить стороннюю форму выглядеть в едином стиле с нашим брендом.
По мере роста опыта я также начал помогать команде с Code Review и QA , гарантируя, что функционал, попадающий в основную ветку (main branch), соответствует нашим стандартам качества.
✖
Приложение Crochet
Масштаб проекта и коммерческий эффект
Во время работы в Chili Labs я взял на себя полную ответственность за разработку Crochet App. Моя работа охватывала весь жизненный цикл: от написания сложных фич и управления релизами в App Store до “подкапотных” задач, таких как миграция версий Flutter и отслеживание сбоев (crash reporting). Главным достижением проекта стало коммерческое влияние моих инженерных решений. Полностью переработав первое впечатление пользователя и оптимизировав процесс оплаты, я успешно удвоил ежемесячную выручку приложения.
Монетизация и удержание пользователей (Retention)
Во-первых, я разработал новую функцию онбординга . Изначально пользователи попадали в приложение практически без инструкций. Я создал интерактивный многошаговый процесс настройки, где пользователи могли выбрать свои предпочтения и сразу понять ценность приложения (например, добавление пряжи или крючков). Это кардинально улучшило удержание пользователей, гарантируя, что больше людей останутся в приложении достаточно долго, чтобы задуматься о подписке.
Во-вторых, я переработал систему подписок. Я создал динамический механизм для показа различных экранов “Call to Action” (CTA) - от простого дизайна до сложных макетов с видео. Используя Firebase Remote Config и Analytics , я проводил A/B-тесты для выявления наиболее эффективных версий. Сочетание улучшенного онбординга и A/B-тестирования на основе данных стало прямой причиной роста дохода на 100%.
Облачная архитектура и интеграция с AWS
Одной из ключевых функций, которую я реализовал, стал цифровой каталог физических инструментов пользователя. Это потребовало гибридного облачного подхода. Я интегрировал Camera API для съемки и использовал AWS S3 для эффективного хранения изображений, синхронизируя метаданные с Firebase . В процессе я изучил AWS SDK для настройки безопасной аутентификации и загрузки файлов в среде Flutter.
Оптимизация: Синхронизация “Offline-First”
Самой сложной технической задачей стала база данных пряжи. Нам нужно было предоставить пользователям огромный набор данных о типах пряжи, но загрузка всего объема из Firebase при каждом запуске была бы невероятно медленной и дорогой из-за стоимости операций чтения.
Я решил эту проблему, разработав кастомную систему инкрементальной синхронизации . Приложение хранит локальную JSON-копию базы и при запуске проверяет сервер только на наличие изменений (diffs). Если есть обновления, скачиваются только новые данные; в противном случае загрузка происходит мгновенно из локального хранилища. Это решение обеспечило 100% оффлайн-работу приложения.
Функция голосовых команд
Также я работал над функцией голосовых команд, позволяющей пользователям управлять приложением без помощи рук (hands-free) во время вязания. Это включало интеграцию библиотеки распознавания речи для добавления или удаления рядов в схеме вязания. В конечном итоге эта фича не пошла в релиз, но именно она вдохновила меня на тему моей бакалаврской работы.
✖
TinyEar
Исследовательская проблема
Для получения степени бакалавра я исследовал технические ограничения мобильного распознавания речи. Облачные API создают неизбежные риски конфиденциальности, проблемы с задержкой (latency) и высокие расходы, в то время как существующие оффлайн-решения часто страдают от низкой точности. Моей целью было устранить этот разрыв, перенеся точность модели OpenAI Whisper на мобильные устройства в полностью автономной среде.
Системная инженерия (JNI и C++)
Я разработал TinyEar как переиспользуемую Android-библиотеку. Основным вызовом была производительность, так как запуск модели Transformer на мобильном CPU требует значительных ресурсов. Чтобы решить эту проблему, я обошел стандартные слои выполнения Java. Я написал слой интеграции на C++ с использованием Java Native Interface (JNI) для запуска моделей TensorFlow Lite непосредственно на нативном “железе”.
Возможности и реализация
1. Точность транскрипции файлов
Библиотека обрабатывает сырые аудиофайлы для генерации текста с высокой точностью.
Сравнить с исходным аудио:
2. Обработка в реальном времени
Используя JNI-оптимизацию, библиотека выполняет живую транскрипцию напрямую с микрофона, не блокируя основной поток UI (Main UI Thread).
3. Пайплайн голосовых команд
Я реализовал интерпретатор, который сопоставляет естественную речь с исполняемыми функциями.
Ввод: “Show time” (Покажи время) → Действие: Отображает часы.
Ввод: “Say Hello” (Скажи привет) → Действие: Выводит приветствие.
Производительность и оптимизация
Основной фокус дипломной работы был направлен на энергоэффективность. Наивная реализация быстро разрядила бы батарею из-за непрерывной работы движка инференса (inference engine).
Для решения этой проблемы я внедрил Voice Activity Detection (VAD) . Система анализирует сырой аудиосигнал для детектирования тишины и запускает ресурсоемкую ML-модель только при наличии речевых паттернов. Дополнительно я реализовал логику “Wake-Word” (активация по слову). Система мониторит поток на наличие ключевой фразы (например, “Okay Phone” ) и выполняет команды только после ее распознавания.
Результаты
В бенчмарках дипломной работы TinyEar продемонстрировал значительное снижение WER (Word Error Rate) по сравнению с устаревшими библиотеками, такими как PocketSphinx. Библиотека доступна на GitHub как open-source решение для Android-приложений, ориентированных на конфиденциальность.
✖
Sophie Conran
Архитектура проекта и стек
Я работал Frontend-разработчиком для Sophie Conran , британского премиум-бренда кухонных принадлежностей. Платформа была построена на Magento 2 с использованием фронтенда ScandiPWA . Моя роль заключалась в реализации строгих дизайн-требований бренда в виде функциональных React-компонентов, взаимодействующих с бэкендом Magento через GraphQL .
Интеграция Headless CMS (Блог)
Я отвечал за инженерную реализацию блога на сайте. Чтобы маркетинговая команда могла легко управлять контентом, я внедрил воркфлоу Headless CMS . Клиент использовал стандартный WYSIWYG-редактор в Magento для создания постов. Затем я разработал кастомный React-компонент, который получал этот контент через GraphQL и рендерил его на фронтенде. Такое разделение (decoupling) позволило маркетингу обновлять блог без привлечения разработчиков, сохраняя при этом целостность дизайна сайта.
Сложная UI-инженерия: «Умный» сайдбар
Технически наиболее сложной задачей стала боковая панель навигации (сайдбар). Требования выходили за рамки стандартных возможностей CSS: сайдбар должен был быть фиксированным (Sticky), но при этом скроллируемым .
Поскольку контент сайдбара часто был выше высоты экрана пользователя, обычное свойство position: sticky обрезало бы нижние пункты меню. Я написал кастомную JavaScript-логику вычислений , которая отслеживает направление скролла и границы вьюпорта.
Логика: Если пользователь скроллит вниз, сайдбар фиксируется, пока не будет достигнут его нижний край. Если скроллит вверх — он перестраивается и выравнивается по верху.
Результат: Эта логика гарантирует доступ ко всему меню независимо от размера экрана, создавая ощущение приложения, что критически важно для премиального UX.
Ваш браузер не поддерживает тег video.
✖
RunQuest (Квалификационная работа)
Контекст и масштаб проекта
Этот проект стал моей итоговой квалификационной работой в Рижском государственном техникуме (RVT) , где я успешно защитил диплом с оценкой 8/10 . Целью было решение проблемы оттока пользователей в фитнес-приложениях через внедрение “геймифицированного” опыта бега. Проект не ограничивался написанием кода - это была полноценная работа по полному жизненному циклу разработки ПО, потребовавшая написания 151-страничной технической документации, включающей сбор требований, системное моделирование и реализацию.
Системная архитектура
Я спроектировал слабосвязанную (decoupled) full-stack архитектуру, чтобы мобильный клиент оставался легковесным, а сложная логика обрабатывалась на сервере.
Мобильный клиент (Flutter): Использовал Flutter благодаря его кроссплатформенным возможностям. Приложение обрабатывает геолокацию (Google Maps) и объединяет данные сенсоров (GPS + Акселерометр) для отслеживания движения пользователя в реальном времени.
API слой (GraphQL): Реализовал GraphQL API с использованием graphql-yoga. Это было стратегическое решение, позволяющее мобильному приложению запрашивать точные данные (например, конкретную статистику инвентаря) в одном HTTP-запросе, минимизируя трафик для мобильных пользователей.
База данных (MySQL): Спроектировал нормализованную реляционную базу данных для обеспечения целостности данных. Схема требовала сложного маппинга отношений “Многие-ко-Многим” (Many-to-Many), особенно в части инвентаря пользователей и социальных графов (друзья/челленджи).
Ключевые особенности
Ключевой функционал
1. Безопасная аутентификация и управление сессиями
Безопасность была приоритетным требованием для квалификации. Я реализовал stateless-аутентификацию с использованием JWT (JSON Web Tokens) и защитил учетные данные пользователей с помощью хеширования bcrypt . Также реализовал логику обработки сессий для управления истечением токенов и безопасного хранения данных на устройстве.
2. Анти-чит и игровая логика
Поскольку в приложении присутствует виртуальная экономика (монеты/XP), валидация пробежек была критически важна. Я разработал серверную логику для анализа входящих временных меток GPS и дистанции. Система помечает пробежки, превышающие человеческие лимиты скорости (например, использование автомобиля), чтобы предотвратить инфляцию игровой экономики.
3. Инвентарь и транзакционная целостность
Я создал надежную систему инвентаря, где пользователи могут экипировать предметы на свой аватар. Бэкенд обеспечивает строгие логические ограничения. Например, система гарантирует, что пользователь не сможет одновременно экипировать два предмета одного типа слота (например, надеть две шляпы).
Профессиональный рост
Этот проект стал поворотным моментом в моей карьере. Это было моим глубоким погружением в типизированные языки (переход на Dart) и проектирование бэкенд-систем . Опыт документирования всего жизненного цикла, от первой UML-диаграммы до финальной сборки APK, дал мне прочный фундамент в понимании того, как специфицируется и поставляется профессиональное программное обеспечение.
✖
Приложение Bondora Go & Grow
Обзор проекта
Приложение Bondora Go & Grow стало важной вехой в моей карьере в Chili Labs, отметив мой первый значительный вклад в мобильный продукт уровня продакшн. Bondora требовала полной переработки их инвестиционного приложения, что подразумевало переход от устаревшего интерфейса к современному адаптивному UI на Flutter.
Я сотрудничал со старшим ментором для реализации этого видения. В то время как ментор спроектировал сложный главный дашборд, я взял на себя полную ответственность за реализацию ключевых пользовательских путей (user journeys). Это включало флоу онбординга, системы аутентификации, выбор счета и детальные экраны транзакций.
Технический вызов: Интеграция с Legacy API
Главным инженерным вызовом была интеграция с устаревшим (Legacy) REST API. Существующая бэкенд-инфраструктура была построена на старой парадигме, что часто приводило к несогласованным или неполным ответам данных, которые не соответствовали новым требованиям UI.
Чтобы устранить этот разрыв, мне пришлось написать логику адаптации, которая мапила, объединяла и реструктурировала ответы API в чистое состояние, пригодное для использования на фронтенде. Это требовало не просто написания кода, но и тщательного продумывания связей данных, чтобы современный интерфейс работал плавно без необходимости изменений на бэкенде.
Ключевой функционал и кастомные компоненты
Помимо стандартной реализации UI, я разработал несколько кастомных компонентов для соответствия специфическим финансовым требованиям и стандартам юзабилити.
Кастомный ввод валюты: Я создал динамическое поле ввода, которое форматирует значения в реальном времени по мере набора. Оно автоматически адаптируется под необходимые пробелы и разделители, а также обеспечивает соблюдение настраиваемых лимитов транзакций.
Интерактивный дашборд счета: Я реализовал логику отображения динамических финансовых данных, включая интерактивные графики и детальные выписки по операциям.
Переработанные пользовательские сценарии: Я спроектировал полный жизненный цикл экранов Входа, Обзора счета и Деталей, обеспечив бесшовный опыт использования (UX) от запуска приложения до управления инвестициями.
Обеспечение качества (QA) и архитектура
Для обеспечения долгосрочной поддерживаемости и стабильности мы приняли строгую архитектуру BLoC в сочетании с принципами MVC. В мои обязанности входило:
Юнит-тестирование: Я написал production-ready юнит-тесты для всех новых функций, обеспечив полное покрытие реализованной логики. Этот строгий подход к тестированию был критически важен для финансового приложения, где ошибки в расчетах недопустимы.
Кроссплатформенная реализация: Я обеспечил идентичное отображение и поведение приложения как на iOS, так и на Android устройствах, обрабатывая специфические для платформ нюансы UI.
Профессиональный рост
Этот проект значительно ускорил мой рост в работе с фреймворком Flutter. Он превратил меня из обучающегося в независимого разработчика, способного отвечать за реализацию крупных функциональных блоков. Я научился ориентироваться в сложностях разработки корпоративного ПО (enterprise software), от взаимодействия с QA-командами до управления ограничениями легаси-систем, внеся вклад в успешный релиз продукта.
✖
Cervera
Контекст проекта
Cervera, ведущий шведский ритейлер кухонных принадлежностей и товаров для дома, начал полную модернизацию своей платформы. Существующий сайт сильно зависел от серверного рендеринга (SSR) страниц на .NET, не имел полноценного API-слоя и требовал перехода на React SPA (Single Page Application) без остановки текущих бизнес-процессов.
Мой вклад
Работая преимущественно над фронтендом, но также выполняя задачи на бэкенде, я помогал переводить архитектуру с многостраничного .NET Core на связку .NET + React. Моя основная роль заключалась в том, чтобы связать старую систему (“легаси”) с новым дизайном:
Миграция: Перенес UI-компоненты на React и адаптировал пользовательские сценарии (user flows) для работы в модели SPA.
Адаптация бэкенда: Провел рефакторинг логики существующих .NET контроллеров, чтобы вместо готового HTML они отдавали на клиент структурированные данные.
Интеграционные решения: Там, где API еще не было готово, я реализовывал временные способы передачи данных (например, инъекцию данных через теги script), чтобы сохранить работоспособность функционала.
Результат
Обновленное React SPA приложение сейчас находится в продакшене, обеспечивая более плавную навигацию без перезагрузок страниц и упрощая поддержку кодовой базы. Благодаря этому проекту я получил глубокий практический опыт работы с архитектурой .NET, паттернами проектирования React SPA и решением задач по модернизации легаси-систем “на лету”, не прерывая работу сайта.
✖
Школа Атроди
Обзор проекта
На моем первом хакатоне наша команда решала UX-проблему: государственные данные о школах и детских садах существовали, но были скрыты в неудобных для использования таблицах. Мы решили визуализировать эти данные на интерактивной карте. Проект оказался успешным: мы стали финалистами и были приглашены презентовать свое решение в штаб-квартире LMT .
Инженерное решение
Я отвечал за Frontend-разработку , написание логики на JavaScript для получения данных из SQL базы данных и их отрисовку в виде маркеров на карте Leaflet.js .
Проблема с данными:
Критическая проблема заключалась в том, что исходный госреестр содержал адреса, но не GPS-координаты, что не позволяло разместить маркеры на карте. Вместо того чтобы вручную искать координаты для тысяч записей, я разработал автоматизированный процесс. Я настроил пакетную конвертацию адресов в координаты через Google Maps API. Затем мы импортировали этот “чистый” набор данных в нашу SQL базу, обеспечив высокую точность работы приложения.
Дополнительные сложности:
Еще одной проблемой было отсутствие данных по университетам и профессиональным училищам. Эту часть нельзя было автоматизировать, поэтому мне пришлось вручную находить и добавлять эти учреждения в базу данных, включая информацию о профессиях и доступном образовании.
Результаты и профессиональный рост
Этот проект заложил основу моих навыков в геопространственной разработке (geospatial development). Освоение Leaflet.js и нормализации данных позволило мне в дальнейшем создавать более сложные приложения. Более того, это научило меня интегрировать свою фронтенд-логику с бэкенд-архитектурой партнера и презентовать технические продукты в условиях высокого давления.
✖
CitySense (LATA Hackathon 2019)
Концепция: Навигация с приоритетом комфорта
Большинство навигационных приложений оптимизируют маршрут исключительно по скорости. Однако, как житель Риги, регулярно пользующийся транспортом, я знал, что “самый быстрый” маршрут часто означает поездку в переполненном автобусе. Чтобы решить эту проблему, я спроектировал CitySense - движок маршрутизации, оптимизированный для Комфорта Пассажира . Приложение позволяло пользователям пожертвовать несколькими минутами времени в пути ради значительно более приятной и свободной поездки.
Скриншот из проекта, демонстрирующий схематичную визуализацию уровня загруженности автобусов. В данной версии отображаются все маршруты города с условной толщиной линий. Как прототип будущего функционала, этого было достаточно для демонстрации концепции.
Инженерная часть и логика данных
Я выступал в роли Lead Full-Stack разработчика на этом проекте, реализовав большую часть приложения за 48 часов.
Главным инженерным вызовом было определение того, как узнать, переполнен ли автобус, без датчиков реального времени. Я разработал прогностическую модель, используя открытые данные (Open Data) Rīgas Satiksme :
Сбор данных: Мы анализировали временные метки валидации билетов (э-талонов) на конкретных остановках.
Предиктивное моделирование: Так как пассажиропоток имеет циклический характер, мы сопоставили историческую плотность с конкретным временем суток.
Визуализация: Приложение накладывало эти данные на OpenStreetMap , чтобы показать “тепловую карту загруженности” (Crowd Heatmap) для приближающегося транспорта.
Ретроспектива
Мы успешно представили работающее демо. Хотя мне удалось интегрировать сложный стек (React, GraphQL, Laravel), выполнение этого в условиях экстремально сжатых сроков стало ценным уроком по архитектуре ПО. Я убедился, что для быстрого прототипирования выбор знакомого, легкого стека часто эффективнее, чем избыточное усложнение тяжелыми инструментами вроде GraphQL.
✖
Ace Your Trace
Контекст проекта
Ace Your Trace проект разработанный небольшой командой в рамках хакатона выходного дня. Целью было помочь пользователям создавать простые персональные маршруты для прогулок во время пандемии COVID-19. Мы хотели дать людям инструмент для исследования окрестностей в пределах заданной дистанции в то время, когда общественные места были закрыты (похожая концепция реализована в Routeshuffle ).
Несмотря на жесткий дедлайн (48 часов), мы представили функциональный прототип, позволяющий выбрать точку старта, ввести желаемую дистанцию или длительность и за секунды получить кольцевой маршрут. Эта быстрая реализация принесла нашей команде 3-е место на мероприятии.
Техническая реализация и функции
Я сосредоточился на основной логике работы с картой и маршрутизацией, интегрировав OpenStreetMap и Leaflet для визуализации. Приложение использует Geolocation API для определения текущего местоположения пользователя и Directions API для расчета путей.
Система поддерживает гибкую настройку: пользователи могут задавать конкретные параметры, такие как расстояние и время. После установки параметров приложение генерирует маршрут и отрисовывает его на карте с помощью полилиний (polylines). Интерфейс спроектирован для моментального отклика: при изменении настроек через панель управления карта и данные маршрута обновляются динамически без перезагрузки страницы.
Рефакторинг архитектуры
Хотя версия для хакатона была рабочей, код был сильно связанным и сложным для расширения. После мероприятия я переработал проект, переведя его на профессиональную модульную архитектуру с использованием ES6 модулей . Я внедрил строгое разделение ответственности (Separation of Concerns), разбив логику на специализированные классы:
Settings: Управление пользовательскими настройками и валидация ввода.
MapController: Логика взаимодействия с картой и рендеринг.
RoutingService: Управление API-вызовами и расчет маршрутов.
UIController: Обработка событий интерфейса и обновление DOM.
Для обеспечения плавного UX я использовал современные практики JavaScript, включая Async/Await и промисы, для обработки асинхронных запросов маршрутизации и обновлений карты.
Бизнес-потенциал и исследование рынка
После хакатона мы рассматривали возможность масштабирования прототипа в коммерческую платформу. Мы спроектировали структуру, накладывающую слой геймификации на логику маршрутов, включая Челленджи (задания), привязанные к физическим локациям, Механизм вознаграждений за выполнение задач и Социальные функции для соревнования с друзьями.
Мы также исследовали возможность внедрения геолокационной рекламы, где спонсоры могли бы размещать брендированные задания или точки на карте. Оглядываясь назад, эта модель имеет много общего со Sponsored Locations в Pokémon GO и стратегиями событийного маркетинга, которые используют торговые центры (например, Akropole Alfa ) для привлечения потока посетителей. Хотя мы решили не продолжать развитие проекта, этот опыт дал ценное понимание быстрого прототипирования и коммерческого потенциала LBS-сервисов (Location-based services).
✖
Банковское приложение
Контекст проекта
Этот проект начался как курсовая работа в Рижском государственном техникуме (RVT). Целью было спроектировать и создать функциональное банковское приложение с использованием Java и принципов объектно-ориентированного программирования. Я самостоятельно выполнил начальную разработку за две недели, реализовав полный стек: от пользовательского интерфейса на JavaFX до интеграции с базой данных MySQL.
Позже, набравшись опыта, я вернулся к этому проекту для рефакторинга. Моей целью было применить продвинутые паттерны проектирования и архитектурные принципы, изученные с момента первой версии, и превратить студенческую работу в чистое, структурированное приложение.
Архитектура и дизайн
Я структурировал приложение с использованием паттерна MVC (Model-View-Controller) для четкого разделения ответственности (separation of concerns):
Model: Определяет сущности данных (Пользователи, Счета, Транзакции) и бизнес-правила.
View: Отвечает за представление интерфейса с помощью JavaFX и FXML макетов.
Controller: Обрабатывает ввод пользователя, управляет логикой валидации и обновляет Модель.
Для эффективного управления состоянием UI я внедрил паттерн Наблюдатель (Observer) . Это позволило интерфейсу динамически реагировать на действия пользователя (например, активация кнопок транзакций только при выборе конкретного счета в таблице).
Ключевой функционал
1. Панель администратора и аутентификация
Система имитирует реальные банковские процедуры, где создание счета, это контролируемый процесс. Я реализовал Панель администратора, которая позволяет сотрудникам создавать новых пользователей и генерировать счета. Безопасность была приоритетом, поэтому я интегрировал хеширование bcrypt , чтобы пароли пользователей никогда не хранились в открытом виде.
2. Операции со счетами и бизнес-логика
Ядро приложения обрабатывает финансовые транзакции: депозиты, снятие средств и переводы. Я разработал строгую логику валидации для обеспечения целостности данных, включая проверку существования получателя и достаточности баланса перед выполнением любой операции.
Также я реализовал специфические бизнес-правила (согласно техническому заданию) для различных типов счетов:
Кредитные счета: Пользователи получают скидку 5% на комиссии за транзакции.
Сберегательные счета: Пользователи получают бонус 5% на депозиты (за исключением внутренних переводов между своими счетами).
3. Логирование данных и отчетность
Для поддержки аудита я создал систему логирования, которая записывает критические действия, такие как создание счетов и перевод средств, напрямую в базу данных MySQL. Эти данные позволяют администраторам генерировать отчеты и отслеживать историю операций в системе.
Рефакторинг и выводы
Рефакторинг кода дал мне ценное понимание архитектуры программного обеспечения. В моей первоначальной реализации баланс счетов обновлялся напрямую в базе данных. Вернувшись к проекту, я осознал, что более надежный подход для финансовых систем — это вычисление баланса на основе реестра транзакций (transaction ledger).
Этот проект стал важным этапом в понимании того, как программно обеспечивать соблюдение бизнес-правил, и почему важно использовать проверенные паттерны, такие как MVC, для поддержки гибкости кодовой базы по мере ее роста.
✖
Поисковая система Giphy
Обзор проекта и архитектура
Целью этого проекта была разработка кроссплатформенного мобильного приложения, взаимодействующего с Giphy REST API. Для обеспечения поддерживаемости и тестируемости кода я спроектировал архитектуру на базе паттерна MVVM (Model-View-ViewModel) . Для управления состоянием (state management) я использовал Provider , что позволило эффективно отделить бизнес-логику от UI. Такое разделение делает интерфейс реактивным и легким, обновляя его только при изменении данных.
Инженерные решения и производительность
Работа с медиа-насыщенными приложениями требует строгого внимания к производительности и управлению памятью. Я использовал две ключевые оптимизации:
Оптимизация сети (Debouncing): Чтобы избежать превышения лимитов API (rate-limiting) и сэкономить трафик, я реализовал кастомный “Debouncer”. Он откладывает вызов API до тех пор, пока пользователь не перестанет печатать в течение заданного времени, что значительно снижает количество лишних запросов во время ввода.
Бесконечная пагинация: Вместо загрузки тысяч изображений сразу, я реализовал ленивую загрузку (lazy loading). Приложение отслеживает позицию скролла и автоматически подгружает следующую порцию GIF при приближении к концу списка, обеспечивая плавную прокрутку и низкое потребление памяти.
UX и устойчивость приложения
Особое внимание я уделил корректной обработке граничных случаев (edge cases). Я реализовал надежную систему обработки ошибок для ситуаций с потерей соединения или некорректными ответами от API. Интерфейс динамически обновляется, показывая пользователю понятные уведомления, вместо того чтобы оставлять пустой экран или допускать падение приложения (crash).