Опишите ключевой проект на предыдущем месте работы.

Ответ

Разрабатывал мобильное банковское приложение (iOS) для крупного финансового учреждения. Основная цель — предоставить клиентам полный спектр услуг: просмотр балансов, история операций, денежные переводы, оплата услуг и управление картами.

Технический стек и архитектура:

  • Архитектура: MVVM-C (Model-View-ViewModel-Coordinator) для разделения ответственности и навигации.
  • UI: Гибридный подход — новые модули на SwiftUI, легационные экраны на UIKit.
  • Реактивность: Combine для биндинга данных между ViewModel и View.
  • Сеть: URLSession с оберткой, использующей async/await, и Codable для парсинга JSON.
  • Локальное хранилище: Core Data с оптимизированной моделью для кэширования истории операций.
  • Безопасность: Keychain Services для хранения чувствительных данных, биометрическая аутентификация.

Мой ключевой вклад:

  1. Разработка модуля «История операций»:
    • Реализовал бесконечную ленту с пагинацией и предварительным кэшированием.
    • Добавил сложные фильтры и категоризацию трат с анимациями на SwiftUI.
  2. Интеграция биометрической аутентификации:

    import LocalAuthentication
    
    func authenticateUser() async throws -> Bool {
        let context = LAContext()
        var error: NSError?
    
        guard context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) else {
            throw AuthError.biometryUnavailable
        }
    
        return try await context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics,
                                                localizedReason: "Войдите для доступа к счету")
    }
  3. Оптимизация производительности:
    • Сократил время холодного старта на 30% за счет отложенной загрузки неключевых модулей.
    • Реализовал встроенный кэш изображений для аватаров контрагентов.

Процесс: Работа велась по Scrum с двухнедельными спринтами. Приложение было опубликовано в App Store и на момент моего ухода имело более 500 000 активных пользователей с рейтингом 4.8.

Ответ 18+ 🔞

Ну и вот, сидишь такой, разрабатываешь приложение для банка, ага. Не какую-нибудь хуйню с котиками, а мобильный банк для конторы, у которой денег, как говна за баней. Цель — чтоб клиент, сидя на унитазе, мог всё: посмотреть, сколько у него осталось до зарплаты, куда он всё просрал, и кому-нибудь срочно денег перекинуть, пока не передумал.

На чём всё это колхозилось, или «технический пиздец»:

  • Архитектура: MVVM-C. Это чтобы не получилась одна большая ViewController-помойка, где всё свалено в кучу, как в шкафу у подростка. Координатор (этот самый «C») отвечает за навигацию, чтобы не было этих ебаных present и push на каждом углу.
  • UI: История, как в жизни — старый хлам и новая фигня. Легаси, который писал ещё дядя Вася в 2015-м, — на UIKit. Всё новое, блядь, — на SwiftUI. Потому что «так модно, молодёжно», а на деле — два разных мира, которые надо заставить дружить. Ёперный театр.
  • Как данные бегают: Combine. Ну, чтобы когда в одном месте что-то поменялось, в другом само всё обновилось, без этих вечных reloadData(). Магия, блядь.
  • Сеть: Раньше писали горы кода с completion-блоками. Теперь взяли URLSession, обернули в async/await, и стало красиво, как в рекламе. JSON парсим через Codable — просто говоришь «эй, вот структура, будь человеком», и он, сука, заполняет.
  • Локальная база: Core Data. Ну, куда ж без неё. Чтобы, даже если интернет сдох, пользователь мог посмотреть, как он вчера в баре всё спустил. Оптимизировал модель, чтоб не тормозило при тысячах операций.
  • Безопасность: Пароли, токены — всё в Keychain. А чтобы зайти, можно пальцем приложить или лицо показать. Удобно, блядь.

Что я там такого наворотил, пока не свихнулся:

  1. Модуль «История операций»: Это не просто табличка. Это, блядь, бесконечная лента. Листаешь, листаешь, а оно подгружает новое, как в соцсетях. И всё кэшируется, чтоб не дергать сервер каждые пять секунд. Добавил ещё фильтры — можно отобрать платежи только за шаверму, например. С анимациями на SwiftUI, чтоб красиво было, ебушки-воробушки.
  2. Вход по лицу/пальцу: Ну, стандартная тема, но надо было сделать надёжно и без косяков. Код вроде такого:

    import LocalAuthentication
    
    func authenticateUser() async throws -> Bool {
        let context = LAContext()
        var error: NSError?
    
        guard context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) else {
            throw AuthError.biometryUnavailable
        }
    
        return try await context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics,
                                                localizedReason: "Войдите для доступа к счету")
    }

    Выглядит просто, а попробуй обработай все ошибки, когда у пользователя пальец грязный или он в перчатках. Пиздец, а не работа.

  3. Оптимизации: Приложение раньше запускалось, как паровоз из прошлого века. Я посмотрел, что грузится в самом начале, и выкинул всё, без чего можно первые пять секунд прожить. Холодный старт ускорился на 30%, чих-пых! Ещё сделал кэш для картинок — аватары контрагентов не качаются каждый раз, а лежат на телефоне.

Как мы работали: По Scrum, да. Двухнедельные спринты, ежедневные стендапы, где все говорят, что они вчера делали. Иногда казалось, что это просто ритуал, чтобы оправдать свою зарплату. Но, в итоге, приложение выкатили в App Store. И знаешь что? Оно не сдохло! На момент, когда я сваливал, там было больше полумиллиона активных юзеров и рейтинг 4.8. Вот так вот, блядь.