Vlad Sobenko
Я вообще привык разрабатывать через контракты.
Как писал на том же пхп. Пишу модуль. Вижу, что нужна абстракция, для того же репозитория, или какие то вычисления. - Я сразу создают интерфейс для этой репы, для вычислений. Только потом пишу реализации. Часто одна имплементация для прода. 1 для тестов.
Слодный контракт, например async iterable типами описать мало, у него есть сложное поведение и типы могут совпадать, а поведение другое