Я HR в этой компании
No description
{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Проект: ИСАУТП «Белка-советчик» / «Интеграл» (Интеллектуальная система управления для горно-обогатительной отрасли)Ключевые обязанности и зона ответственности:Участвовал в полном цикле разработки backend-части распределенной системы: от настройки инфраструктуры до внедрения на стороне заказчика.Разрабатывал и поддерживал API на FastAPI: создание новых эндпоинтов, реализация кастомных исключений, сложной системы проверки прав доступа (авторизация через Keycloak, разграничение доступа к данным на уровне пользователей и ресурсов).Проектировал схему базы данных и работал с данными: разрабатывал модели для PostgreSQL через SQLAlchemy, управлял миграциями (Alembic), занимался оптимизацией сложных запросов.Процесс оптимизации запросов: исследование плана выполнения запроса (Execution Plan), выявление и оптимизация узких мест (bottlenecks), рефакторинг запросов с использованием обобщенных табличных выражений (CTE). Финальный этап — перенос оптимизированного запроса в код SQLAlchemy.Строго следовал принципам Clean (Hexagonal) Architecture: выделял слои (core, use cases, ports, adapters), писал абстракции для DAO и их реализации, обеспечивая независимость бизнес-логики от внешних фреймворков.Обеспечивал качество кода: разрабатывал unit и интеграционные тесты на Pytest (с использованием моков и фикстур), участвовал в код-ревью, следовал методологии GitFlow.На начальном этапе выполнял задачи DevOps: формировал инфраструктуру проекта на основе контейнеров (nginx, postgres, pgadmin, keycloak), настраивал Apache NiFi для сбора данных с серверов заказчика, занимался развертыванием продукта на серверах заказчика базе хостовой ОС Astra Linux.Оказывал поддержку смежным командам: вносил доработки во фронтенд на Vue.js.Ключевые достижения:Ускорил генерацию отчета «О работе системы» с 30 минут до 1-2 минут (85%+) и снизил потребление RAM. Провел глубокий профилирование кода (в том числе с использованием CProfile): протестировал различные алгоритмы группировки (groupby, defaultdict, setdefault) и преобразования данных, выявил узкие места. Оптимизация заключалась в переносе агрегации и вычисления перцентилей на уровень PostgreSQL с использованием CTE, а также внедрении потоковой обработки (async-генераторы) для отдачи данных.Ускорил обработку временных рядов в отчете «Фактическое управление»: интегрировал библиотеку Polars для переноса логики агрегации из SQL в слой ядра приложения.Изначально вся логика сбора и агрегации данных была реализована на уровне адаптера (DAO) с использованием сложных CTE-запросов. Хотя это обеспечивало производительность, такой подход нарушал принципы \"чистой архитектуры\", смешивая бизнес-логику с инфраструктурным слоем.Решение: Переработал DAO — теперь он отвечает только за выдачу сырых данных. Всю дальнейшую обработку (фильтрацию, группировку, агрегацию, соединение таблиц) вынес в слой ядра, реализовав её через высокопроизводительную библиотеку Polars.Результат: Сохранил скорость обработки данных, полностью соблюдая принципы \"чистой архитектуры\", и повысил тестируемость бизнес-логики за счёт её изоляции от инфраструктуры.Реорганизовал архитектуру генерации отчетов: вынес логику построения Excel-документов из usecase в слой инфраструктуры, внедрив фабрику построителей документов.Ранее формирование Excel-файлов было напрямую зашито в ядре приложения, что нарушало принципы \"чистой архитектуры\". Провел рефакторинг: реализовал фабричный паттерн, который позволяет регистрировать для каждого типа отчета доступные форматы выгрузки (Excel, PDF, HTML и др.).Как это работает: Фабрика централизованно управляет созданием документов, а usecase контролирует допустимость запрашиваемого формата и возвращает понятную ошибку при попытке выгрузить недоступный тип.Результат: Обеспечил единый стиль создания всех отчетов, строгое соблюдение принципа Open/Closed (расширение новыми форматами без изменения существующего кода) и чистоту архитектурных слоев.Повысил безопасность системы: внедрил централизованное шифрование чувствительных данных в конфигурациях интеграций на основе симметричного шифрования Fernet (стандарт AES-128 в режиме CBC с аутентификацией HMAC-SHA256), что обеспечило конфиденциальность и целостность хранимых паролей.Разработал механизм автоматического шифрования паролей при сохранении настроек подключения к внешним базам данных. Ключевая сложность: каждая интеграция имела уникальную структуру полей, причем пароли могли храниться в нескольких полях с разными префиксами и на произвольной глубине вложенности.Решение: Реализовал рекурсивный обход конфигурации с поиском и шифрованием полей, содержащих пароли, независимо от их уровня вложенности. При выдаче данных:На интерфейс: пароли автоматически маскируются (отображается заглушка), даже если поле находится глубоко в структуре.Для систем-потребителей: пароли отдаются в расшифрованном виде только в момент установки подключения.Результат: Полностью исключил риски утечки чувствительных данных через API, сохранив прозрачность работы с конфигурациями для пользователей и работоспособность всех интеграций."}]}]}