А вот развитие в сторону условного функционального программирования происходит действительно легко и просто. Есть функции, есть интерфейсы, и есть чётко отделённые от них структуры данных, и надо просто учиться это всё комбинировать и выстраивать цепочки трансформаций.
Но я не могу так учить, потому что 100% вакансий будут требовать знания ООП.
Однако из позитивных трендов нельзя не упомянуть Go и Rust, где никаким наследованием и не пахнет. Впрочем, в computer science это было давно известно, вот легендарный учебник "Object-Oriented Programming With ANSI-C" 1993-го года от одного из святых cs, крайне рекомендую всем вне зависимости от того, на каком языке вы пишете.
Код/логика должен быть простым, а для этого он должен быть прежде всего плоским. Ну ок, на хаскеле наверное это получается лучше всего, но например в F# есть модули, интерфейсы , статические методы, SRTP...
type Adder<'T> = { Add : 'T -> 'T -> 'T }
let addValues adder a b = adder.Add a b
let intAdder = { Add = (+) }
let result = addValues intAdder 3 5Ну и конечно либа FSharpPlus.
