We are looking for a Backend Developer with experience in machine learning – and preferably also OCaml! – to join our Research & Development team. You will help build machine learning research prototypes and be responsible for integrating them into new and existing products.
At Issuu, we use OCaml extensively in our production systems. If you love OCaml and functional programming in general, Issuu is a great place to put your passion into real-world products!
Please find more information about this position at the following link:
I would love to hear more about your OCaml backend stack
Well, we love to talk about our OCaml stack!
We rely on the Jane Street ecosystem a lot, using Core as a Stdlib replacement and Async for monadic concurrency.
AMQP forms the backbone of our messaging system, and therefore we use amqp-client extensively.
We use both MySQL and Postgresql databases in production. For the former we use ppx_mysql, and for the latter, PGOCaml. (Thanks to Docker, we can give PGOCaml compile-time access to the DB without having to depend on the actual production DB.)
We currently use Protobuf for serialisation, but spend a great amount of time complaining about it. We rely on ocaml-protoc-plugin to generate the OCaml code from Protobuf definitions.
Anyway, that’s just the basics of our stack. Do let me know if there’s something else you’d like to know in more detail!
Do you use Protobuf for interop with non-OCaml systems? If not, I’m curious about whether you’ve considered bin_prot as an alternative; it seems like an obvious choice if you’re using Core/Async.
Great answers. Jumping on the questions thread,
I’m curious about how you structure the business code (for want of a better word), in between the technical layers of talking to AMQP or an SQL store. Are there larger scale patterns like CQRS or DDD that you use to organise code?
How do you package up code for deployment? Docker / AWS something.
Yes, we use Protobuf mainly because we have a heterogeneous stack, where besides OCaml we also have services running Python, Kotlin, or Elixir.
We’re slowly migrating to a micro-service architecture (the pros and cons of which are outside the scope of this thread; that’s a can of worms I’d rather not open…) whose cast of characters includes “entities” (responsible for storing/retrieving data from DBs), generic backend services that encapsulate business logic, frontend services, and backend-for-frontend services.
We’re using Docker for deployment on AWS (mostly), and slowly migrating from Docker Swarm to Kubernetes.