Anyone whoās been following this blog probably saw this coming:
Itās an interesting read and hopefully can be used as constructive criticism in order to improve the state of the OCaml ecosystem.
A bit tough to read but he hasnāt said anything unfamiliar.
Iām trying to put myself in his position and wondering what Iād do differently. Probably the biggest thing is Iād use js_of_ocaml based adapters to call into Node.js libs to fill in ecosystem needs, rather than considering the much more laborious work of binding C or Rust libs.
Iād like to know what about Lwt the author struggled with. The model it provides is not very unique or different from what many developers already do with Node.Js.
For improving our documentation, what if we made it clear on ocaml.org that weāre looking for more documentation and a clear process on how to get your docs onto ocaml.org? Sometimes I have a free weekend and now I think I could use that to write docs but itād be nice to know if I write it, it will make it to someplace useful rather than just a blog post.
I wonder if the real deal-breaker was the GCE APIs. I mean, everything else is workable ā just takes a little coding. I suppose (not having looked) that the GCE APIs are exposed via GRPC ā and thatās a non-starter right now in OCaml, sooo ā¦
My current thinking on documentation is to note each tutorials existence on ocamlverse, but house the actual tutorial as a heavily commented example program (maybe using https://github.com/lindig/lipsum), residing directly within the library that itās documenting in an additional ātutorialsā directory of the package. That addresses the code rot problem without adding a lot of complexity to the ocamlverse implementation, since the library author can build the tutorial source as part of regular CI.
I think as a community if we want good docs weāll also have to come to terms with how diverse Ocaml programmers are. At the very least, Lwt and Async. Also Core vs Batteries vs containers. There are various reasons to prefer one over the other but those reasons are likely not important to a new user.
Followup to yesterdayās article:
Re: more documentation/tutorials, this has been mentioned here before but Iād like to +1 both using asciinema
and uploading them to asciinema.org.
Example, this simple tutorial on installing opam on Ubuntu:
https://asciinema.org/a/36250
Briefly: asciinema is a tool that records your terminal. You just run (e.g.) asciinema rec bash
and it produces a very space efficient, copy-and-pasteable video that you can upload to asciinema.org or host yourself. After years of struggling to follow along in YouTube tutorials which have blurry console screens this is a breath of fresh air.
Funny that I took the opposite journey as Dark as regards F# versus OCaml. In various ways I also prefer F# - I think the syntax is a little cleaner and having access to the .NET standard library and ecosystem is obviously useful. Mailboxes are nice too for concurrent programming! But I donāt like having to butt up against the OO system all the time while Iām trying to think functionally (I felt the same way with Clojure many moons ago) and the experience with implementing anything non-trivial on Linux with .NET Core was not fun. Constant DLL hell when trying to develop with a Postgres driver, for example.
I do think the Darklang posts raise some good points. I am also surprised that they found Lwt tricky to use, or they found functorized hashtables difficult. Ergonomically I find them absolutely perfect as soon as youāve created your desired module from the functor.
The only major GCP API I can think of that only speaks GRPC is Cloud Bigtable. All of the big ones like GCE, Spanner, GCS and Datastore, also speak HTTP with JSON encoded data.
The blog post specifically mentions the lack of a spanner library. I think some of the challenges to developing one are that the API surface is quite large, and testing it would cost money.
To be honest, both OCaml and F# are a poor choice for a cross-platform language. First has many obstacles on Windows platforms while the second - on anything besides Windows. Rust, on the other hand, is the first class citizen everywhere.
The cross platform story for F# should get better now that dot net core is the primary dot net version thatās used everywhere. After reading this post I tried setting up F# on a Mac and it was quick and easy to get up and running (with decent editor setup via LSP + neovim).
butt up against the OO system
This exactlyā¦ The least bad option for me for using other ecosystems backend libraries is probably ocaml talking to golang libraries. I havenāt looked up whether this actually is possible currently
I canāt compare OCaml to F# hereāIāve never used F#ābut when I was learning OCaml, I read through the description of the Jane Street maps/hashes etc. and kind of ran screaming. The online docs for the JS maps were even scarier. Yes, partly itās that I was coming from Clojure, where you can just throw anything into a map, because itās dynamically typed and maps are designed that way. But still ā¦ I thought, I know itās harder with OCaml because it needs to be type safe, but still there has to be a better way. So it wouldnāt surprise me if F# maps were easier to understand.
Biggarās description of the F# ecosystem reminds me of Clojure. Maybe in some nearby possible world OCaml-Java could have played a similar role. Or maybe, per @mbacarella:
For me, the article highlights the need for there to be an informal way for people to signal that they have private source code that they will share with others directly, upon request. I am sure someone has google cloud bindings, just no one wants to put such a library on GitHub, because they donāt have the time to answer issues or support the library. Generally, if people put more of their libraries on GitHub (or more open system like codeberg), but marked their repo as āarchivedā, that would be a good way to signal other people can copy it, while telling others not to bother contacting for support
GitHub allows switching off the wiki, issues, and PRs per repo.
[full disclosure: I lived thru the first ten years of Java at IBM, and watched as the āJDKā grew to engulf library-after-library. I will always prefer the OCaml or Perl model of user-contributed libraries, b/c monoculture led to bugs and lack of flexibility. And I can always write my own version of whatever missing package. I mean, itās just not that damn hard.]
I wonder if what heās really complaining about is lack of a large commercial backer (Java has many, F# has MSFT, Rust has ā¦ ? (maybe none, which would disprove this thesis)).
Repeatedly in both the linked articles, as well as his comparison of OCaml to Rust, it seems like heās complaining that there arenāt enough ālibraries that he needsā available. And to be sure, for a commercial organization, this could be a dealbreaker. [A quick Google search shows what appear to be Perl APIs for Spanner, so thereās at least an existence proof for a community-backed language having such support.]
I do wonder how Rust does it. Are there more commercial users? Are there big commercial backers?
I donāt think Rust is much closer to OCaml when it comes to ecosystem than Java, F# or Go for that matter. And actually the commercial baker in Goās case seems to prove your point:
This is a chart showing the number of pull requests to repos in a given language on GitHub. Itās not a good measurement of popularity but maybe it is a good measurement of the ecosystem health.
Well he also complains about the syntax and that āI saw a team struggle with OCaml, and for good reason. Language tutorials are extremely poor in OCaml compared to other languages; theyāre mostly lecture notes from academic coursesā. I have some sympathy: for example, writing code to an interface is a fairly basic starter for a programmer but not intuitive in ocaml: the most direct equivalent requires module signatures with abstract types and sharing constraints and possibly functors (the last three of which are unavailable in F#), and there is nothing in the ocaml websiteās āLearnā section explaining how to achieve this kind of equivalence.
That is probably for good reason. In ocaml it is generally more idiomatic to think of such things in terms of higher-order functions and combinators, or pattern matching on variants. There is a cognitive jump involved.