Working with several teams of combined 10+ devs on a few large code-bases in Clojure.
It works just fine. Very often, the context of your changes are local to a handful of functions - most of them being pure and simple to test.
I'm actually surprised how well it works compared to Java - for example - where long-distance dependencies can bite you in surprising ways - even with refactoring tools.
Clojure does have types and you can add compile-time tyoe-checking as an option, but it often is just in the way.
I don't miss types for modelling a domain at all. Maps/sets/vectors/lists are sufficient.
Granted: Your names better be good and you better use something like spec/malli etc. on the boundaries of your app/module for safety.
If bugs happen it typically is due to nil-punting and bad tests.
The nice thing: Those things are easily fixed. There's nothing complicated in Clojure.
What I can't get back to: compile, run, fail loop (vs. read, eval, print, loop).
The REPL allows you to live inside your app and it is just beautiful.
It works just fine. Very often, the context of your changes are local to a handful of functions - most of them being pure and simple to test.
I'm actually surprised how well it works compared to Java - for example - where long-distance dependencies can bite you in surprising ways - even with refactoring tools.
Clojure does have types and you can add compile-time tyoe-checking as an option, but it often is just in the way.
I don't miss types for modelling a domain at all. Maps/sets/vectors/lists are sufficient. Granted: Your names better be good and you better use something like spec/malli etc. on the boundaries of your app/module for safety.
If bugs happen it typically is due to nil-punting and bad tests. The nice thing: Those things are easily fixed. There's nothing complicated in Clojure.
What I can't get back to: compile, run, fail loop (vs. read, eval, print, loop). The REPL allows you to live inside your app and it is just beautiful.