This is my perspective, as a fairly seasoned engineer who’s been using ReScript for about three years and is on decently sized team of ReScript developers with a number of projects in production.
I might have some criticisms but I say all of this in love because I appreciate your hard work. I wish I felt like I could contribute more to the community and maybe if I can better understand what is going on, I will be able to.
On community:
I’d caution against confusing Growth and Community. Community doesn’t come from growth alone but from like-minded people who are able to feel that investing their time in your project will be good for
them and for you over the long run… or even better, that they can feel like it’s our project.
I often see people in other projects spend so much effort trying to make things beginner-friendly (in the interest of growth) that they alienate the people who have graduated from beginner and are now
trying to solve harder problems. A lot of core community growth comes from people trying to solve specific problems for their business/project that the language doesn’t solve for them (and
usually, the language shouldn’t solve those problems because it’d just grow to the point of unmaintainability.)
Those people are naturally going to be on the edge of things, using uncommon features, reading compiler code and probably doing things that you aren’t comfortable with. Those people are also key to growing a community because they are the most invested. Without those people, you just have a churn of beginners. But, reading comments over the past few years, I can see those people feel alienated. Mostly, I believe, because of mismatched expectations.
Maybe at beginner you just care about understanding things and getting things compiled and running… JS FFI, testing… the bare minimum. But once you’ve done that for a while and you hit the next level, you start looking at solutions to the other real problems. Maybe they’re problems that required by your business to put code in production, or maybe they’re just annoyances for your team. Things like reducing boilerplate, strengthening your typing, better designing your domain models, code coverage, automating manual tasks. At the moment, all of those things usually move people closer to OCaml than ReScript.
For example, my team writes server projects with a ton of control-flow logic. We have some frontend code too but for the most part we’re not writing projects where we can just lean on React to do a bunch of heavy-lifting for us. Infix operators and the PPX for let bindings (not await. I avoid promises like the plague) make our lives so much easier. We like ReScript AND we like those things. We’re professionals
writing production services, we are making these decisions for good reasons and we don’t need someone in the forum making smartass jokes about how x #$ v @#$ z is hard to read. That’s not helpful and it is a key issue that makes me not want to invest in this community.
On OCaml:
I know you say you mean no disrespect. And I understand your frustration… but your attitude in the things you write about OCaml doesn’t really help your points. I think it would be more helpful if you would just say “We won’t upgrade OCaml. End of story.” and move on.
Personally, I consider myself a pretty experienced ReScript user (and a moderate OCaml user) and I don’t really care about any 1:1 relationships with OCaml. If you removed every single OCaml module
tomorrow and I could still compile my project, I would be happy. When removing the Marshal module broke our build, I wasn’t worried about the Marshal module going away… I didn’t even know it existed in
ReScript. I was just afraid that for what seems like the tenth time in the past year, I would have to spend hours/days of my life changing code that worked fine yesterday for reasons that hadn’t (at the time) been explained.
Another example is that recently in OCaml community, they are shifting to a new macro lib (this happens every 6 years, camlp4 -> camlp5 -> ppx -> migrate-parsetree -> ppxlib)
Six years is a helluva long time. They’re solving problems. They’re making quality of life improvements. The reason there is a new macro lib is that it will be much easier to maintain. This is exactly the
problem you see people bring up with ReScript: “Things are changing again? My stuff breaks. I don’t understand the benefits. Why is this happening?..” Well… to make a better, smaller, more maintainable
and enjoyable project.
The other constant complain is that our compiler is not using their latest bleeding edge version. But for the JS platform, does it really matter which minor version do you use? The difference is very small even between version from 4.02 and 4.12 from type system point of view.
From 4.02 to 4.12 is seven years of bugfixes, small features and (most important to me) quality of life improvements. It’s unhelpful for your argument to pretend that this is nothing. Anyone can go read the release notes so I won’t bring all of that up here. There are things in there I would love to have that would improve my quality of life… but not having them isn’t going to make me abandon ReScript, it just makes me a little less happy.
I personally don’t expect you stay on the bleeding edge and I think anyone that does expect that doesn’t understand your goals for the project. But it’s better to say that it’s a lot of work you don’t want to do right now than to say that it is not valuable.
In the native world, the multiple thread support is coming, however, it does not exist in JS platform, do we really need to be compatible with such features? Our type system has been developed for many years, and you don’t want to change it for non obvious benefit.
I agree anyone asking for multicore support in ReScript simply doesn’t understand things. It just doesn’t make sense. But the Effect system they’re building (which is enabled by multi-thread) is a game-changer. It isn’t in OCaml 5, but hopefully it will be in there soon because I think it will redefine how people see the language. I’ve written services in languages with Effect systems… I’ve written an Effect
system. Once you use one you never want to write code another way. I don’t actually expect ReScript to take this on. It’s very difficult. But there is much more work going into that than just “multiple thread support”.
I am thinking that it will be good that we as a community reach a consensus that ReScript is its own language so that we can move forward; the majority of ReScript users don’t need touch the OCaml toolchain. This is good for OCaml too, they have a very high quality compiler js_of_ocaml where they can focus on its improvement.
I think that’s a great idea and honestly, I think you already have consensus. Anybody still around is invested enough in ReScript to see that through. I think it’s important to remember though, that when
somebody asks for a feature that OCaml has, or Haskell has, or Ruby has… or when someone has a problem with a dependency compiling… it’s not always just because they think you need to stay on the
bleeding edge of OCaml things. They’re just trying to solve their problems, they need help, and they could find it in other places.
It’s also very important for you to be happy. And I think it’s important to be very vocal and overly communicative of what makes you happy working on ReScript and what you want to do long-term. At this point I’ve spent as decent amount of time in ReScript and I still just don’t understand what the plan is for anything. Because of that, right now, I don’t contribute to the ReScript ecosystem. But I’d like to.