1) If it's simple to imagine the computer doing something, it should be easy to program.
2) If it's simple to analyze something mathematically, it should be easy to program.
The first path leads to C-style programming with pointers and loops. The second path leads to lazy pure functional programming and beyond.
Personally, I'm in the first camp. Small functional programs are often shorter and more beautiful than their imperative and OO counterparts, but large functional programs quickly accumulate so many abstractions that they become incomprehensible to me, more so than large imperative or OO programs.
Maybe that just says something about my intelligence, or maybe the functional camp hasn't yet figured out how to write large programs in a readable way. Case in point, see the list of operators defined by the popular Lens library in Haskell: http://hackage.haskell.org/package/lens-3.8.5/docs/Control-L...