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

На каком этапе был проект когда ты пришел на прошлое место работы?

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

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

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

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

Отличный вопрос, который позволяет раскрыть не только состояние проекта, но и подход кандидата к работе в разных условиях. На моем предыдущем месте работы основной проект, в который я был приглашен, находился на этапе активной разработки в рамках long-term поддержки и масштабирования (Stage 2-3 по моей внутренней классификации). Если детализировать, это была фаза между завершением формирования MVP (Minimum Viable Product) и переходом к стадии зрелого продукта с растущей пользовательской базой.

Контекст и состояние проекта

Проект представлял собой многофункциональное банковское приложение (fintech) для iOS, которое уже было опубликовано в App Store и имело несколько десятков тысяч активных пользователей. Ключевые характеристики на момент моего прихода:

  1. Архитектура: В проекте применялся классический MVC (Massive View Controller), который уже начал показывать свои недостатки: некоторые UIViewController-ы содержали более 2-3 тысяч строк кода, бизнес-логика была тесно переплетена с логикой отображения, модульное тестирование практически отсутствовало.
  2. Кодовая база: Существовал работающий, но «исторически наросший» (legacy) код. Были участки, написанные с использованием Objective-C (около 30% кода), и основная часть на Swift, но Swift 3/4 без активного использования современных возможностей языка (протокол-ориентированное программирование, имутабельные структуры данных).
  3. Команда и процессы: Команда разработки состояла из 5 iOS-разработчиков. Использовался Agile/Scrum с двухнедельными спринтами. CI/CD (Continuous Integration/Continuous Deployment) был настроен, но процесс занимал около 40 минут из-за большого количества UI-тестов, написанных на KIF.
  4. Основные задачи на тот момент:
    *   **Добавление новых фич** согласно приоритетному бэклогу продукта.
    *   **Рефакторинг критических модулей** для снижения связанности (coupling) и повышения тестируемости.
    *   **Работа над производительностью:** устранение задержек в UI, оптимизация потребления памяти, особенно в разделах со сложными коллекциями.
    *   **Поддержка и исправление багов**, поступающих от пользователей и QA-отдела.

Мои ключевые действия и вклад на старте

Приходя в такой проект, важно не сломать существующую функциональность, но при этом планомерно улучшать код. Моя стратегия включала:

  1. Глубокий анализ и погружение:
    // Пример "наследия", которое я обнаружил в коде платежного модуля:
    class PaymentViewController: UIViewController {
        var networking: NetworkService! // implicitly unwrapped optional, force unwrap в коде
        var database: DatabaseManager!
        var formatter: NumberFormatter!
        var currentUser: User?
        // ... 2000+ строк кода, совмещающих валидацию форм, сетевые запросы, 
        // сохранение в БД и обновление UI.
    }
    
    Первые две недели я посвятил изучению кодовой базы, запускал **Instruments (Time Profiler, Allocations)**, чтобы выявить узкие места, и активно общался с командой, чтобы понять боль и «исторические» причины текущей архитектуры.

  1. Постепенный, инкрементальный рефакторинг. Вместо глобальной переделки я предложил и инициировал переход к MVVM (Model-View-ViewModel) для новых экранов и постепенного переписывания наиболее проблемных старых.

    // Подход для новой фичи после рефакторинга:
    // Четкое разделение ответственности
    struct Transaction { // Model - чистая структура данных
        let id: String
        let amount: Decimal
        let date: Date
    }
    
    class TransactionListViewModel { // ViewModel - бизнес-логика
        private let service: TransactionServiceProtocol
        @Published var transactions: [Transaction] = []
        @Published var isLoading = false
    
        func fetchTransactions() { ... } // Легко покрывается unit-тестами
    }
    
    class TransactionListViewController: UIViewController { // View - только отображение
        private let viewModel: TransactionListViewModel
        private var cancellables = Set<AnyCancellable>()
    
        private func bindViewModel() {
            viewModel.$transactions
                .receive(on: DispatchQueue.main)
                .sink { [weak self] transactions in
                    self?.updateUI(with: transactions)
                }
                .store(in: &cancellables)
        }
    }
    
  2. Внедрение современных практик: Я выступил инициатором:

    *   Перехода на **Swift Package Manager** для управления внутренними библиотеками вместо CocoaPods там, где это было уместно.
    *   Активного использования **Combine** (проект уже был на iOS 13+) для реактивного биндинга в новых модулях.
    *   Улучшения процесса тестирования: начал писать **Unit-тесты** для новых ViewModel и Use Cases, что постепенно сформировало «защитный пояс» для рефакторинга.

Вывод и результат

Таким образом, проект находился в фазе роста и технического долга, что является классическим и очень показательным этапом. Он требовал не просто навыков кодирования, но и архитектурного мышления, такта и умения вносить изменения, минимизируя риски. Мой приход был нацелен на баланс между оперативной разработкой новой функциональности для бизнеса и стратегическим улучшением кодовой базы для долгосрочной устойчивости и скорости разработки. К моменту моего перехода нам удалось значительно снизить цикл CI/CD, повысить покрытие кода тестами и заложить основу для более предсказуемой и эффективной разработки новых сложных фич.