Been attending the Salt Lake No Fluff Just Stuff conference. Caught Neal Ford's keynote last night on Polyglot Programming.
Ford's main point is that while the JVM is still a strong platform, the Java programming language itself has peaked. He argues that Java is already being replaced with dynamically-typed languages such as Groovy, Ruby, or even functional languages like Scala and Jaskell.
In the process of digging Java's grave, Ford talks extensively about the difference between software engineering and other types of "hard" engineering. Drawing on a 1992 article by Jack Reeves, he makes the point that all engineering has two phases: design and production. In civil engineering for example, there's an indeterminate period of design followed by actual construction. The outcome of the design phase is a blueprint or a manufacturing plan.
In software, you have the same two phases. The difference of course is that the actual production phase is nothing more than compilation, linking, and deployment. The "design" phase, then, is the process of planning and writing source code.
So what's the major takeaway? For Ford (and me) the most important observation is that since software production is relatively cheap compared to traditional engineering production, and since there are no mathematical models for verifying software (as compared to finite element analysis), testing becomes much much more critical.