I read https://www.scala-lang.org/blog/2020/12/15/scala-3-crossing-the-finish-line.html this morning, and wrote up a response on reddit. I was just planning on having a bit of semi-playful rant but now I’m thinking it’s actually appropriate to post here and have a hopefully-productive discussion. I’d also really like to hear from other library authors as well to know their experiences and perspectives on this situation.
So here it is. Although my frustration is genuine, the tone I’m going for is lighthearted, reactionary, conversational and honest to my point of view. It’s not sardonic or scathing or anything like that so although I hope it’s already obvious, if not, please try to see it through my lens.
I’m not annoyed at any of the people, but I am annoyed at the process and how it’s played out with Scala 3.
The very title frustrates me. “Scala 3: Crossing the finish line”. Finish line? What are you talking about? The race hasn’t even begun. From the perspective of the Scala 3 team, I think they think someone fired the gun and the race started years ago, and now the goal is in sight. Nah man, you spent years getting ready for the race. Races don’t take years with athletes starting out incapable and then doing all their training in the race itself. Scala 3 is approaching the starting line, not the finishing line. Announce that you’re ready for the race to begin, then let the race occur with the community/ecosystem running beside you. (To be clear, IMO the 3.0 RC process is the metaphorical race and 3.0.0 GA/final is the finishing line.)
> “japgolly, are you just nitpicking the wording in their choice of metaphor?”
No no no. I’m sticking with the metaphor and highlighting it because it accurately explains the process and expectations I’m seeing, and those would be problematic regardless of the metaphor or wording. The issue is basically “hey we’re gonna give the community a few weeks starting now then it’s 3.0.0 GA and cake time.”
I’ve got like 10 OSS Scala libraries that I need to start cross-compiling for Scala 3, not to mention I should be a good citizen and patiently smile, investigate, minify and report all the compiler bugs I’m going to encounter, then I’ll of course continue being a good citizen and trying to respond to all the github emails I get it in response, and regularly revise my failed migration attempts with workarounds etc etc. All in a month. Over xmas and new years when I have friends staying with me and finally plan to take some time off to avoid my burnout becoming catastrophic.
> “But japgolly, they’ve been publishing Dotty milestones every ~6 weeks, why haven’t you already started?”
Because, in line with the regular Dotty messaging, I was aware that nothing was stable, things were changing all the time and I’m not just talking about things being a little buggy and then stabilising. No, I’m talking about milestones being incomplete, features not being fleshed out and changing between milestones, functionality required by me to be able to cross-compile my stuff not being in place yet (Scala.JS support for example was only added very recently), even now I’m not sure if things are stable. For example is the metaprogramming API all done now? Doesn’t seem to be from what I read (and macros need to be completely re-written for Scala 3).
Even if the milestones were usable to me and had the functionality I need, I don’t have the luxury of so much free time that I can afford to:
- learn how everything works in milestone X
- modify all of my code across all my libraries
- wait for next milestone
- figure out everything that’s changed
- modify all of my code across all my libraries (again)
- repeat repeat
It’s very, very time consuming and I don’t have the time. I don’t think it’s fair to expect library authors to deal with so much churn, at least not in a short timeframe.
My plan was to wait until all the experimentation is done and all the features I need are there, then migrate everything once.
So basically I haven’t migrated my libraries sooner because
- I couldn’t because the required functionality wasn’t there
- Even if it was there, I can’t afford to deal with lots of churn so I need the API to be at least tentatively stable.
> “Ok japgolly. they’re there now and you have a month. All gud rite?”
No not all good. In my opinion, a month is unreasonable.
- That’s very little time to do all the work to migrate my libraries (which I have to do for free in my own time)
- The timing with holidays is terrible. I can’t keep living on the cusp of burnout and although covid isn’t the cause for me, I suspect covid will mean there are many others who are wfh all the time and close to burn out too.
- My libraries integrate with many others in the ecosystem so I have to wait around for those libraries to be ready first
- When issues are inevitably found, it takes time and a significant amount of back and forth to get it resolved and resume progress
> “Hey japgolly. what about the SIP process? … Why am I asking you? Why, for this heading of course!”
Btw hey does anyone remember the SIP process and how all Scala 3 changes (except optional-braces which the ref gave a pass) would go through the SIP process? So I guess that’s happening in the next month too with all discussion concluding and all resulting changes being made in Scala 3 and all library authors updating their code bases to work with the new changes. That’s gonna be a pretty intense month.
> “Ok ok japgolly, much complain. Do you have any suggestions?”
Yes, I suggest this: go through the SIP process properly. After that, release RC1 and let the RC process go for around 6 months. Give the community time. Let the poor people at EPFL have a well deserved break too. Understand that most libraries require unpaid work and are anyway often blocked by dependencies. Get a big community build working before we lock in 3.0 final in stone, with those consequences to last for many years.