Ответ
Процесс структурирован и нацелен на коллективное принятие взвешенного решения.
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 в новых экранах. Старое не трогаем. Петя, Вася, ко мне на недельку — будем разбираться. Всем спасибо, свободны».
Вот так, блядь, и работаем. Не «я решил», а «мы, сука, пришли к выводу». Чтобы потом, когда всё ебнется, виноватых было много.