-
Notifications
You must be signed in to change notification settings - Fork 537
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
CE 3: development process #644
Comments
Seeing nobody replied yet 🙂 I should add that I'm not interested in debating things to death — but I'm afraid of a big code dump on master where details could be missed. And the more people work on an alternative branch built from scratch, the more decisions become irreversible. Therefore I'm hoping for some middle ground, to keep things fun, but at the same time to be able to show some trace of the design decisions being made and the ideal would be to separate stuff in multiple PRs for master. For example the first step is to ... split the project in at least 2 sub-projects, to strip I already started on that split some time ago, but I gave up on it and I think I might have lost the branch I was working on. |
So the Further, nothing on that branch is irreversible. I think as we get further and further along and decisions are built on decisions, certainly it takes more justification to remove something fundamental, but we're not there yet and we probably won't be there for quite a long time. Even once we abandon the branch and start doing work on master towards 3.0, things will still be up for grabs. I feel like this is a really important point, because I sort of dumped a ton of code in
I'm a little skeptical about taking an incremental step towards this, partially because a major goal of the 3.0 push was to get
I agree, though it's worth noting that once the bit is flipped on "we're incompatible!", then further changes beyond that are less relevant since everyone has to be careful. Put another way, I would rather shove all the possible breaking things into one big release, rather than space them out over a large number of (also breaking) releases which make smaller adjustments. With that said though, I do take it very seriously, and there are a lot of ways in which we can make this process as painless as possible. Unnecessarily changing names is a really good example of where migration can be made needlessly hard. It's something that I'm quite concerned about with It's worth noting that scalafix can probably cover a huge percentage of the migration cases currently proposed in CE3. Also worth noting that we're trying to do this very much in coordination with the ecosystem maintainers (both middleware and datatypes), so I expect that by the time we have a CE3 which is ready to
Rich's views on this are commendable, but ultimately impossible in the context of Scala for several reasons. Remember that his views are colored by his firmly held belief that the correct way to build software is with a dynamically-typed, source-linked language with very minimal nominative runtime typing (since most native Clojure data is passed around in maps). So basically, he's baking an implicit assumption into his statements, which is that the general constraints of your runtime system are no more significant than that of a RESTful HTTP API, which is not an assumption which holds for very many ecosystems. Scala is a statically-typed, strongly nominative, binary-linked language with a non-isolate runtime. So we pretty much have the hardest-possible compatibility problem space. The only thing that would make it worse would be if linkage was unchecked at runtime. In theory, Project Jigsaw could have eased the burden quite a bit by giving us controllable version isolates, but… Oracle… is Oracle. So this is what we have. Does that mean we should be cavalier about breaking compatibility? Absolutely positively not. When a cornerstone project like Cats Effect to breaks compatibility, the results are enormously disruptive. It needs to be done very carefully, with a lot of coordination and communication, very very rarely. But sometimes it does need to be done. We really need to break compatibility in CE3. The calculus of CE1 offers guarantees which are over-broad at times (like all With all that said, extraordinary measures require extraordinary justifications. The book is by no means closed on the breakage which has been proposed, or future breakage which may be proposed. Let's carefully justify things every step of the way, honestly examining why we need to change things, and if we don't need to change something, let's just not. |
This issue is about your thoughts on how the development process should go, as we'll need a plan.
What follows is my personal opinion ...
The CE 3 proposal is good and tasteful, it tries to fix several pain points that we are having with the current Cats-Effect hierarchy and I believe it has many good ideas in it.
However once upon a time (in #321 (comment)) I expressed my opinion on how the Cats-Effect 3 development should go:
A good example is the concern I have with in #643 with the
ExitCase
type, because its current shape was chosen due to constraints we bumped into while developing theBracket
type class and all its instances in PR #113, but that due to the noise it's now tribal knowledge. A problem I'm certain we'll bump into again, but only after somebody goes through the pain of implementing actual instances forBracket
.So starting with that proposal is great for the grand picture. However I don't like that we are rebuilding CE 3 from scratch, having a branch for it in which we are pushing changes that are not tested with actual implementations. That branch is great for testing and thinking about the design, don't get me wrong, but I hope you don't plan on that branch being dumped on master.
I mean it's fun and all 🙂 but we've got to do our "due diligence" and ensure that we won't break people's code lightly, given the popularity of the project.
PS — I subscribe to Rich Hickey's views on how and when to break people's code:
So when should we break an API?
The answer should be: never! But for the sake of correctness and given that Scala itself breaks compatibility with every major version, therefore people have some tolerance for breakage, then we can do it from time to time, if it's done for extremely good reasons, hence my concerns about the process we'll take.
Loved this presentation: Spec-ulation — and I totally subscribe to the idea of also changing the namespace when you change the API, unfortunately I can't convince others ¯_(ツ)_/¯
The text was updated successfully, but these errors were encountered: