| The complexity would have been too much if I didn't have Clojure and ClojureScript. They let me remove a lot of incidental complexity and deal mostly with the problem domain (which is complex enough). You can do anything with any language/technology, it's just a question of how many resources you are willing to dedicate to the task. In my case, as a solo bootstrapper, the resources are very limited. Main advantages: * a single language for both client-side (browser) code and server-side code * a single data representation (maps with namespace-qualified keys), so no conversions necessary * spec which helps validate data in multiple places (such as :pre/:post conditions) * core.async which lets me write asynchronous code both in the JVM and in the browser, same primitives * a library of excellent sequence manipulation functions * transducers, which let me build composable data pipelines * the Rum library which lets me use React as a rendering engine, basically a function of my data * most of my domain code is shared between the browser and the server There is more, but these were what I could come up with immediately. I mostly spend time thinking and working on the problem domain, not writing boilerplate (there is none in Clojure, really). |