К основным проблемам фьючи я бы отнёс
- Комбинация только с помощью имплиситного экзекьютора. Можно сломать фор-компрехеншен случайным импортом
- Почти каждая операция требует запуска как минимум одного Runnable. Т.е. синхронизация стейта пулов на каждый шаг. Это действительно сильно аффектит производительность реальных конкурентных приложений
- eager by default. Ничего не мешает воспользовать тем же трейт, чтобы реализовать запуск by need, но это сломает большую часть утилит, они часто исходят из предположения о немедленном запуске
- Стандартные реализации фьючи мутабельные. Сильно. Утилитарный код может порождать множество гейзенбагов, если не учёл все особенности комплита и линка и не перепроверил что-то дважды\не синхронизировался.
- Ручное управление конкаренси. Отличие параллельного от последовательного запуска обычно - это отличие в def vs val. Маленькая ошибка может превратить асинхронный стрим в мемори лик.
- Отсутствие cancelation во встроенной реализации. И не самый простой способ использовать в twitter. Случайно не выполненный вызов сайдэффектящего метода в твиттер приводит к неотменяемости.
- Предыдущее также сильно затруднаяет финализацию ресурсов в конкуретном коде
- Стандартный способ интеграции - промис. И отсутствие встроенного набора конкурентных данных как в cats-effect\zio принуждает пользоваться им довольно часто. Намеренно незавершённый промис - это не отмена, а утечки памяти и нефинализированных ресурсов.
- При написании АПИ, если нужно принять асинхронный процесс в качестве параметра, каждый способ сделать это чем-то плох. Приём by name (=> Future[A]) кажется самым прямым аналогом получения IO[A], однако постоянно ломается при доработках, в особенности новичками. Где-то лишний вал - и фьюча запустилась