← Назад к вопросам

Над каким приложением работаешь?

1.2 Junior🔥 61 комментариев
#Soft Skills и карьера

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Над каким приложением работаю в настоящее время

В данный момент я веду разработку iOS-приложения для финтех-сектора — это мобильный банк для регионального кредитного учреждения. Приложение находится в стадии активной разработки, мы готовим крупное обновление с полным редизайном и добавлением новых финансовых продуктов. Работаю в составе команды из 6 человек: два iOS-разработчика (я отвечаю за архитектуру и сложные фичи), три бэкенд-разработчика и тестировщик.

Ключевые особенности и технологии проекта

Архитектура и подходы:

  • Используем MVVM-C (Model-View-ViewModel-Coordinator) в сочетании с Clean Architecture (слои Presentation, Domain, Data). Это позволяет четко разделять ответственность, писать тестируемый код и легко заменять модули.
  • Для навигации реализован собственный Router/Coordinator, что полностью отделяет логику переходов от ViewController'ов и ViewModel'ов.
  • Внедряем TCA (The Composable Architecture) для новых модулей, чтобы управлять сложными состояниями и сайд-эффектами предсказуемо.

Стек технологий:

  • Язык: Swift 5.9 с активным использованием современных возможностей: акторов (actor), async/await для сетевых запросов, Task для управления конкурентностью.
  • UI: Полностью нативный интерфейс на SwiftUI (основная часть нового дизайна) и UIKit (для легаси-экранов и кастомных сложных компонентов). Используем SwiftUI Preview для ускорения разработки.
  • Сетевое взаимодействие: Собственный клиент на URLSession с оберткой для async/await. Все запросы и ответы типизированы через Codable модели. Для кэширования используем CoreData с фоновым контекстом.
  • Зависимости и управление: SPM (Swift Package Manager) для внешних зависимостей. Внедрение зависимостей через кастомный DI-контейнер (протокол-ориентированный подход).
  • Тестирование: Пишем Unit-тесты (XCTest) для бизнес-логики в Domain-слое и UI-тесты для критических пользовательских сценариев. Стремимся к покрытию ключевых модулей.

Решаемые задачи и вызовы

  1. Безопасность: Реализация биометрии (Face ID/Touch ID), шифрование чувствительных данных в Keychain, защита от отладки и сниффинга трафика (certificate pinning).
  2. Производительность: Оптимизация работы с CoreData (батчевые операции, фоновые контексты), пагинация больших списков транзакций, ленивая загрузка изображений.
  3. Качество кода: Внедрение Code Review, статический анализ через SwiftLint, составление ADRs (Architecture Decision Record) для документирования ключевых решений.
  4. Интеграция: Работа с несколькими микросервисами бэкенда (платежи, карты, уведомления), реализация веб-сокетов для мгновенных push-уведомлений о транзакциях.
  5. Доступность (Accessibility): Добавление меток для VoiceOver, поддержка динамического шрифта (Dynamic Type) — это важно для нашей аудитории, включая пожилых пользователей.

Пример кода (упрощенная ViewModel для экрана входа):

import Foundation

// Domain слой: Use Case
protocol LoginUseCaseProtocol {
    func execute(credentials: Credentials) async throws -> User
}

// Presentation слой: ViewModel
@MainActor
final class LoginViewModel: ObservableObject {
    @Published var login: String = ""
    @Published var password: String = ""
    @Published var state: ViewState = .idle
    
    private let loginUseCase: LoginUseCaseProtocol
    private let coordinator: AuthCoordinatorProtocol
    
    enum ViewState {
        case idle, loading, success, error(Error)
    }
    
    init(loginUseCase: LoginUseCaseProtocol, coordinator: AuthCoordinatorProtocol) {
        self.loginUseCase = loginUseCase
        self.coordinator = coordinator
    }
    
    func signInTapped() {
        guard !login.isEmpty, !password.isEmpty else { return }
        
        state = .loading
        Task {
            do {
                let credentials = Credentials(login: login, password: password)
                let user = try await loginUseCase.execute(credentials: credentials)
                self.state = .success
                // Координатор обрабатывает переход
                self.coordinator.didAuthenticate(user: user)
            } catch {
                self.state = .error(error)
            }
        }
    }
}

Этот проект интересен не только с технической стороны (миграция на современный стек, работа с высокими требованиями к безопасности), но и с продуктовой — мы напрямую влияем на опыт тысяч пользователей, упрощая им управление финансами.