I think it would be fine to talk about it more. Academia in general has tilted so heavily to the side of statically typed languages over the last generation that dynamically typed langs are starved for attention, despite the widespread use of them in actually getting stuff done with no readily apparent difference in quality.
Static typing advocates argue that their programs are better at:
-
Preventing bugs. Last I checked, the issue trackers of the libraries in statically langs were just as full (perhaps more full) of bugs as the dynamically langs, despite all their types and tests. Bugs are not a result of a lack of types, they are the result of confusing/conflicting/changing requirements, domain complexity, insufficient design, concurrency, etc. While statically typed programs prevent certain classes of bugs, those bugs are also trivial to find and fix, and static analyzers for dynamic languages can do that too. Taken to an extreme, static lang fans will suggest things about proving correctness - that capability does not seem to be either easy or widespread to me, and I have doubts that it requires static types to get there.
-
Refactoring. I will grant that static langs provide more support for mechanically altering your program but why do you need to refactor things? Most “refactoring” that I’ve seen is actually adaptation to changing requirements.
For example, adding a field to the UI, that flows into the data, that flows into the business logic that flows into the database. Clojure’s approach here is simple - just add more attributes to your map. You’re still going to need to make changes in certain places, but how many incidental changes do you need to make? My own experience has been that dynamic langs respond to change better, and this is the kind of thing I do most frequently. I hear the static folks starting their “row type” printing presses already.
-
Ease of development. The contention here is that static langs are more amenable to making tools that provide you with better suggestions and completion at development time. But I seem to have a lot of pretty great static analysis of dynamic langs too (and not just in Clojure). I will see your intellisense and raise you a repl for interactive verification and testing. If I had to pick one (I don’t), it would be the latter.
-
Runtime performance. This assertion here comes from being able to use more information about your program to better compile your code. I just don’t see that much evidence of this - there are counter arguments to make about dynamic runtime optimization (where static does not have that info), and about shared intermediate code between dynamic and static langs in most popular runtimes. But if you want to boil it down - in almost all cases, dynamic code is easily “fast enough”.
With Clojure, we can easily build correct, fast programs that respond well to change, at least as well as other statically typed languages. I think there’s more argument to be made that Clojure is particularly good at responding to change over time, certainly that has been my experience.