| We're developing "boring" business applications intended for long (~10y) use: - Kubernetes: provides a good abstraction for running multiple apps and services in a cloud, without vendor lock-in. - Postgres: proven reliability, best (free) relational db with lots of functionality - Clojure: expressive language with huge ecosystem of libraries (since all JVM packages are available) - ClojureScript: also a huge ecosystem (JS interop). Because it is Clojure's sister language, we reduce training need an mental ovehead. It also enables code reuse between server and client in some situations (using .cljc files and reader conditionals). - React + Reagent + Carry framework: sane view rendering and state management - API format: RPC-style HTTPS requests, with payloads in Transit format (so that custom types can seamlessly travel over the wire between CLJ and CLJS) - Our own `devops` automation software which lets us deploy K8S clusters and apps inside of it. It also provides abstractions around AWS services like S3, which should allow us to move to Google Cloud ifneedbe. We also wrote it in ClojureScript and run it using Lumo. - Minikube + some standin apps like Minio (to run an S3-compatible service in a local container). This enables us to develop and test all of our apps locally without deviating much from our prod stack. We also support a `hybrid` mode where you can run your app locally (using a REPL) but let it connect to other services which all run in AWS. This further ensures similarity with prod env. I'm aware some components of our stack might turn out to be wrong choices, so we try to limit blast radius by trying to prevent leaky abstractions where possible. (e.g. our apps are not aware of K8S in any way, and could just as well run on a non-virtual machine, with all related services like DB also running as a local daemon). Our biggest gamble is Clojure(Script), but because of its Java(Script)-interop, the greatest risk there is language stagnation. |