15 years ago? Wow, time flies. I remember this video lighting a fire under the CFML (ColdFusion) community and at least one response video showing how to do the same thing in CFML even more quickly than the Rails version. CFML had loads of frameworks, dating back to its fairly early days with a very simple MVC framework called Fusebox (based on a wiring analogy) and then in the early aughts there was an explosion of OOP MVC frameworks, as well as several ORMs and a few IoC/DI frameworks as well. And, yes, all of those filled a gap caused by lack of expertise because CFML’s main draw was that it was “easy” and that “anyone” could pick it up, even with next to no programming experience (both true).
I contributed to nearly all of them as part of my OSS work and even wrote a few of my own (FW/1 – Framework One – a deliberately “simple”, convention-based MVC framework, and DI/1 which was a deliberately “simple” IoC/DI framework). I even ported FW/1 to Clojure but it wasn’t very idiomatic and as I tried to refactor the design to align more closely with Ring’s architecture I realized just how little value it added on top of Ring.
That was an important realization for me: the simplicity and abstraction level of Ring actually meant that a lot of MVC framework machinery I’d “needed” in CFML (and other languages targeting the web) just wasn’t needed in Clojure. Mapping from
/section/item to the
app.handlers.section/item handler function and the
views/section/item.html template was about the only “benefit” that FW/1 ending up providing in Clojure, over plain Ring/Compojure, and even that was just a couple of simple functions…
It’s a bit like when “Design Patterns” are mapped over to Clojure: almost everything collapses down to simple, consistent abstractions and the use of higher-order functions.
This is why I try to encourage Clojure beginners to avoid any of the “frameworks” in Clojure (including the Luminus project template) and start by writing a “simple” Ring app, then adding routing, then template handling (or Hiccup for HTML) etc…