The longer I work as a software engineer, the more I am convinced that we are doing it completely wrong.
Really, programming is a lot of typing.
There is a lot of boiler-plate. For example, when you write a for loop, a lot of what you type is for the compiler’s benefit. It has little to do with the expression of an algorithm. Similarly for other constructs.
Related program logic is often broken up and placed in different methods and classes. This is a kind of coupling, which is bad.
Program comprehension and refactoring have limited tool support.
I have wandered through the programming language landscape, as I said above, only increasing my dissatisfaction with mainstream languages. I pondered Scala recently, but the syntax felt a little bulky.
Finally, I come to Clojure! The syntax is minimal – close to lambda calculus, with the additional benefit of rich collection types, variable arity functions, amongst other benefits. Leiningen seems to be a very nice package manager.
I don’t know yet about refactoring tools for Clojure. A little search just now found the following page for visualizing the Clojure core.