У вас есть опыт участия в код-ревью?

«У вас есть опыт участия в код-ревью?» — вопрос из категории Софт-скиллы, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый пример ответа, который можно адаптировать под свой опыт.

Ответ

Да, я регулярно участвую в процессе код-ревью как автор, так и ревьювер. Считаю это критически важной практикой для поддержания качества кода, распространения знаний в команде и предотвращения ошибок.

На что обращаю внимание как ревьювер:

  1. Читаемость и ясность: Код должен быть понятен коллегам.
  2. Соответствие архитектуре: Соблюдение принятых в проекте паттернов.
  3. Возможные ошибки: Утечки памяти (retain cycles), некорректная обработка ошибок.
  4. Безопасность: Правильная работа с потоками (thread safety).
  5. Тестируемость: Код должен быть пригоден для модульного тестирования.

Пример улучшения кода после ревью:

// ДО ревью: Проблемы с обработкой ошибок и утечкой памяти
func loadUserData() {
    URLSession.shared.dataTask(with: url) { data, _, _ in
        self.user = try? JSONDecoder().decode(User.self, from: data!)
        self.updateUI() // Вызов на фоновом потоке?
    }.resume()
}

// ПОСЛЕ ревью: Обработка ошибок, weak self, правильный поток
func loadUserData(completion: @escaping (Result<User, Error>) -> Void) {
    URLSession.shared.dataTask(with: url) { [weak self] data, response, error in
        // 1. Проверка на удержание self
        guard let self = self else { return }

        // 2. Обработка ошибок сети
        if let error = error {
            DispatchQueue.main.async { completion(.failure(error)) }
            return
        }

        // 3. Валидация данных
        guard let data = data else {
            DispatchQueue.main.async { completion(.failure(NetworkError.noData)) }
            return
        }

        // 4. Декодирование и возврат результата на главном потоке
        do {
            let user = try JSONDecoder().decode(User.self, from: data)
            DispatchQueue.main.async { completion(.success(user)) }
        } catch {
            DispatchQueue.main.async { completion(.failure(error)) }
        }
    }.resume()
}

Я всегда конструктивно воспринимаю обратную связь и стремлюсь применять её для улучшения кодовой базы.