Haskell all the way 'round
I first titled this Haskell all the way down, but our architecture is not exactly vertical.
We are crossing the I’s and dotting the T’s on a new peer to peer lending site. We’ve used Haskell for everything but the front-end, which is made mostly in Clojurescript. Everything, yes, everything. For our infrastructure we have just 4 tools and some libraries. The tools are Linux, Git, Docker and Haskell. The main libraries are:
- Bake for continuous delivery
- Shake for building docker containers
- Cabal for building haskell applications and libraries
- Propellor for configuring (virtual) machines
- Scotty and other libraries for our REST api.
This allows us to re-apply whatever we learn about our four tools across our application and infrastructure. In the case of Haskell it means that for some things we are the first users (I believe we are for Bake). It also means that we can shape the libraries to our needs. Propellor has been modified to better support configuration development by a team for instance. I’ve used git for years, but since we’re using it for everything learning more about has a much better pay off.
What I like so far, is that compiling configurations in Haskell gives a lot of confidence that long running things like container builds and VM deployments will work as I expect. The learning cliff has been fairly steep at times, but I’m now at the point where reading, writing and reusing other people’s Haskell code becomes progressively easier.
I hear you think, “Why we don’t use a more conventional Continuous Integration solution like Jenkins, or something in the cloud?”. Because we can, and because we like short turnaround times and traceability. Systems like Jenkins were the last pieces of the puzzle that resisted version control and automation (it is possible, but limited and hard). I hope to write a bit more about how we use the individual libraries soon.
Seeing everything as just libraries is quite libraries - no more black boxes anywhere, no magic configuration languages, and the interfaces in our ‘applications’ (e.g. the specific Propellor configuration) show how we see the libraries and what we (don’t) use.comments powered by Disqus