Почему технология RxJava или Executor может быть плохой для использования в проекте
Что проверяют
Умеете ли вы критиковать инструмент предметно, а не по моде. Ответ про сложность и высокий порог входа тут не проходит: ждут конкретных издержек и понимания, что выбор зависит от задачи, команды и того, что уже есть в проекте.
Как отвечать
По RxJava:
- подписки: каждый поток надо отписать. Забытый
DisposableдержитActivityилиFragmentи даёт утечку, а обращение к уничтоженному представлению приводит к падению; - потоки исполнения:
subscribeOnиobserveOnдействуют по разным правилам, и неверно поставленный оператор незаметно уносит работу на главный поток; - ошибки: одна ошибка завершает цепочку целиком, и без явной обработки экран становится мёртвым. Ошибка, пришедшая после отписки, улетает в глобальный обработчик;
- обратное давление: у
Observableего нет, для быстрых источников нуженFlowableсо стратегией, иначе растёт память.
По Executor: это низкий уровень. Отмены, связанной с жизненным циклом, нет, результат надо возвращать на главный поток руками, а исключение внутри задачи теряется, если не смотреть на Future. Неудачно выбранный пул тоже стоит дорого: неограниченный при всплеске создаёт сотни потоков, фиксированный с блокирующими задачами встаёт, а очередь перед ним может расти без предела.
Вывод формулируйте так: для нового кода на Kotlin по умолчанию берут корутины и Flow, потому что отмена там структурная и привязана к области видимости. RxJava оправдана, если проект уже на ней и команда её знает.
Где спотыкаются
Ругают RxJava общими словами и не могут назвать ни одной конкретной проблемы. Интервьюер ждёт разговора про утечку из незакрытой подписки или про обратное давление, а получает пересказ впечатлений.
Второе: обещают переписать всю асинхронную часть разом. Постепенная миграция через адаптеры реальна, единовременная переделка рабочего кода редко окупается и надолго оставляет в проекте две модели отмены сразу.
Третье: предлагают один общий пул потоков на всё. Блокирующие операции забивают его, и не связанные с ними задачи встают в очередь; разделение на пулы под ввод-вывод и под вычисления обязательно.