I might even argue that easy to read and easy to reason about are opposites.
For the most part, languages like Python and Ruby can be very easy to read but difficult to understand precisely what actually happens at runtime.
Things like LLVM IR are much more explicit, making it easier to reason about but extremely difficult to read.
Maybe somewhere between is "pure" side effect free functional programs.
I might even argue that easy to read and easy to reason about are opposites.
For the most part, languages like Python and Ruby can be very easy to read but difficult to understand precisely what actually happens at runtime.
Things like LLVM IR are much more explicit, making it easier to reason about but extremely difficult to read.
Maybe somewhere between is "pure" side effect free functional programs.