Как обычно проходит процесс обсуждения и принятия твоих технических предложений в команде?

Ответ

Процесс структурирован и нацелен на коллективное принятие взвешенного решения.

1. Презентация идеи: Я готовлю краткое обоснование, которое включает:

  • Проблему: Какую текущую боль или неэффективность мы решаем?
  • Предлагаемое решение: Конкретная технология или архитектурное изменение.
  • Преимущества и риски: Плюсы, минусы, оценка сложности внедрения.

2. Техническая дискуссия: Команда задает уточняющие вопросы, обсуждает альтернативы, рассматривает edge-кейсы и возможное влияние на другие части проекта.

Пример обсуждения внедрения Combine для сетевых запросов: Я бы показал сравнение подходов:

Традиционный подход (closures):

// Много вложенности, сложная обработка ошибок
URLSession.shared.dataTask(with: request) { data, response, error in
    if let error = error { /* Обработка ошибки */ return }
    guard let data = data else { return }
    // Декодирование и обновление UI
}

Предлагаемое решение (Combine):

// Декларативный, цепочечный код, встроенная обработка ошибок
URLSession.shared.dataTaskPublisher(for: request)
    .map(.data) // Извлекаем данные
    .decode(type: User.self, decoder: JSONDecoder()) // Декодируем
    .receive(on: DispatchQueue.main) // Переключаемся на главный поток
    .sink(
        receiveCompletion: { completion in
            // Централизованная обработка завершения (успех/ошибка)
        },
        receiveValue: { user in
            // Обновляем UI полученными данными
            self.updateUI(with: user)
        }
    )
    .store(in: &cancellables)

3. Обсуждение рисков: Команда могла бы задать вопросы:

  • Совместимость: Поддержка iOS 13+ (минимальная версия для Combine).
  • Кривая обучения: Готова ли команда изучать реактивное программирование?
  • Интеграция: Как совместить с существующим кодом?

4. Принятие решения: На основе обсуждения мы принимаем коллективное решение (например, начать постепенное внедрение Combine в новых модулях, сохраняя старый код, или выбрать альтернативу).

Ответ 18+ 🔞

А, ну это ж классика, блядь! Собрать всех умников в кучу и решить, какую хуйню будем городить. Процесс, говоришь? Да он у нас, сука, как в аптеке — всё по полочкам, чтобы потом не орать «а кто это, блядь, одобрил?!».

1. Презентация идеи, или «Смотрите, какую дичь я придумал» Тут главное — не начать с «Ребят, я тут почитал статейку...». Надо вломиться с четкой аргументацией, а то засмеют, пидарасы.

  • Проблема: Надо объяснить, от какой конкретной боли мы все вместе страдаем. Типа: «Бля, смотрите, наш сетевой слой — это пиздец какой-то спагетти-код, каждый новый запрос — это копипаста старого и три новых бага. Мы уже, блядь, 15 раз один и тот же URLSession оборачиваем».
  • Решение: Не «давайте попробуем эту вашу реактивщину», а конкретно: «Предлагаю внедрить Combine для всех новых фич, чтобы не ебаться с колбэками».
  • Плюсы и минусы: Тут надо быть честным, как сивый мерин. «Да, ребята, преимущества — код как песня, а риски — половина команды первые две недели будет сидеть с круглыми глазами и хуярить документацию».

2. Техническая дискуссия, или «А давайте обосрём идею со всех сторон» Вот тут-то и начинается цирк. Все начинают умничать, выёбываться и копать в самые неожиданные места.

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

Старый способ, на closures (наш текущий пиздец):

// Гляньте, блядь, эта пирамида пиздеца! Ошибка тут, данные там, всё в кучу.
URLSession.shared.dataTask(with: request) { data, response, error in
    if let error = error { /* Обработка ошибки */ return }
    guard let data = data else { return }
    // Декодирование и обновление UI
}

Смотрите, один забыл guard — и приложение хуй знает где повисло. Классика!

А теперь, блядь, предлагаемый способ (Combine):

// Красота, ёпта! Всё по цепочке, как по ниточке. Прям читается.
URLSession.shared.dataTaskPublisher(for: request)
    .map(.data) // Вытащили данные, бля
    .decode(type: User.self, decoder: JSONDecoder()) // Распаковали
    .receive(on: DispatchQueue.main) // И на главный поток, сука, без танцев с бубном
    .sink(
        receiveCompletion: { completion in
            // Всё, приехали. Успех или просрались — всё тут, в одном месте.
        },
        receiveValue: { user in
            // Получили юзера — обновили интерфейс. Красота!
            self.updateUI(with: user)
        }
    )
    .store(in: &cancellables)

Видите разницу? В первом случае — лапша, во втором — инструкция, блядь, как сборку мебели из Икеи (только нормальную).

3. Обсуждение рисков, или «А теперь давайте найдём, где это всё развалится» Тут команда просыпается и начинает долбить вопросами, ёпта:

  • Совместимость: «А iOS 12, блядь? У нас же ещё 3% пользователей!». И тут надо не сдриснуть, а сказать: «Так, сука, для них оставим старый код, а новое — только для 13+».
  • Кривая обучения: «Мы ж все заколебёмся это учить!». И тут парируешь: «А вы не бздите. Первую фичу сделаем вместе, я покажу, потом сами втянетесь. Зато потом в разы быстрее будете писать».
  • Интеграция: «А как это, блядь, в наш старый говнокод впихнуть?». И вот тут ключевой момент: «А никак, сука. Не трогаем старое. Новые модули — на Combine. Постепенно, без паники».

4. Принятие решения, или «Ну что, погнали или нет?» И вот после всех споров, препирательств и показательных выёбов, приходим к консенсусу. Не к «ой, давайте попробуем», а к чёткому: «Решили — начинаем внедрять Combine в новых экранах. Старое не трогаем. Петя, Вася, ко мне на недельку — будем разбираться. Всем спасибо, свободны».

Вот так, блядь, и работаем. Не «я решил», а «мы, сука, пришли к выводу». Чтобы потом, когда всё ебнется, виноватых было много.