Just starting with clojure, my main struggles so far have been:
There’s kind of a lot of… everything. Big standard library, many keywords / built in macros, and libraries. With libraries/tooling it’s hard to see the differences between om, reframe, uix, reagent, etc… should I be using lein, clojure cli, boot, shadow-cljs, cljsbuild, etc… I’m starting to sort out the answers, but definitely has been a source of friction. But I suppose that’s kind of part of the learning process, isn’t it.
As compared to Lua, maybe, and C. It’s actually quite small compared to any other language I know, in large part due to carefully chosen abstractions. JS, Java, Python, C++ - they all have a much larger standard library, a much larger set of keywords (assuming you mean reserved or special in some way symbols, and not just some :i-am-a-keyword keyword literals), and the amount of syntax is not even comparable.
With libraries/tooling it’s hard to see the differences between om, reframe, uix, reagent
That would also happen in any other language where there’s any choice for a particular task. Here, I’d say Om should not be used at all (it’s not under development anymore), Reagent is a thick layer on top of React that provides a bunch of nice abstractions and Hiccup syntax, re-frame is a library on top of Reagent that enables nice global state management, and UIx is a very thin layer on top of React, without any abstractions.
should I be using lein, clojure cli, boot, shadow-cljs, cljsbuild
Definitely not Boot, it got pretty much phased out by other tools. I prefer Clojure CLI, with shadow-cljs for CLJS - I find Lein too cumbersome and any other CLJS tooling lacking.
But I suppose that’s kind of part of the learning process, isn’t it.
I struggled with that too. I eventually figured out that all those choices are far less “heavy” than they are in other languages, because they do a few things, and get out of your way. Unlike how, for example, every choice in .NET feels like choosing a new life-long career.