-
Notifications
You must be signed in to change notification settings - Fork 20
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
RFC: O3DE Deprecation Strategy #50
Comments
There are cases in which it may be necessary to maintain some backwards compatibility, in this cases it's necessary to implement version conversion to allow for data migration between versions. The deprecation strategy may need to provide a documentation on the deprecation mechanics (i.e. version converters). This is most often required when deprecating code that is reflected for scripting, but other elements require data migration across versions as well. |
I think we need some slightly clearer guidance around time frame for applying O3DE_DEPRECATION_NOTICE. For example, how long can an API be marked as deprecated? Reading between the lines is seems that we are saying you mark in one release and remove in the next, but its unclear if thats the expectation. In addion, devs currently do not know the release schedule for O3DE, solvable but we do need a clear source of truth here. Also is there a minimum deprecation notice period? We should also probably call out that Feature deprecation should also be announced in the TSC channel and if cross-cutting its responsibility to get cross SIG sign-off. |
This will hopefully be helpful in identifying the scope of users impacted by the deprecation of APIs/systems. In the case of newer APIs/systems, we would probably be able to iterate quicker (as you stated). Whereas with the older systems there is probably a mix of things that are simply now unused vs. ones that our users still rely on. This should give us the data to make informed decisions, rather than guessing at what things users are/aren't using. |
Tangential to this, but I think we should also have a better way to handle editor versions as requirements for Gems activation. Right now, if an API is available up until (for example) v21.11 but has then been removed in 22.05.0, where is no way for Gems to enforce or even recommend a minimum or compatible version that could guide the user in understanding which version of a Gem will work with which version of the Editor. Guidelines for deprecation should likely fit into this picture as well. |
We should also reference this guide in the "code" section of the Contributor Guide. Also, documentation should be addressed in this strategy. Considerations include:
|
It'd be nice to have some more clarity on how long to wait between each step for the deprecation. For example, if I want to deprecate a functionA and move its dependencies to functionB, how long should I wait between different steps. If we decide releases to be the deciding factor, the deprecation schedule would look like:
Waiting for releases to remove code could be a lot of wait time particularly if we want to move to step 2 sooner because sometimes its necessary to change behavior to unblock other features. So maybe the recommended wait time between each step should be something like "'n' number of days or next release(whichever comes sooner)" ? |
Hello everyone! Sorry I'm just now responding to the RFC feedback, I really appreciate everyone who has so far taken a look and given feedback. I'll go through each person in turn... @lsemp3d - backwards compatibilityThat's a great call-out, it might not be something the deprecation doc itself covers, but there should be a link to a 'data migration' document that discusses how to do this (as data migration could happen independently of deprecation, they are orthogonal concepts). Unfortunately I do not think such a system or document yet exist (at least for JSON, we could still mention the ObjectStream version converters). I'll include a missing link section to address this and work with the team owning this to add such a guide when possible. @lmbr-pip - time-frame for
|
As well as considering how stable/volatile the API is, I think it could be useful to think about how big the impact will be in terms of blast radius. For example, if you changed something in AzCore, the blast radius would be huge, but some changes may be much more contained in their potential impact. It might be nice to be able to expedite the deprecation process if the blast radius is small enough (maybe a sig chair could make a ruling on that). Another idea is that for changes with low impact, if it's possible to provide a script that can perform any necessary migration, that might be another case where the deprecation policy could be relaxed a bit. |
This is a great callout @greerdv, I'll update the text in the code block to reflect this and will try and discuss this with sig-release soon. Cheers! |
I'm supportive of this (I won't be in the meeting next week). I think we need to find the right place for this to live. I'm less concerned about getting this perfect right now, and more concerned about getting something in place. We need to think of our processes as living, breathing processes. Adding a bit of feedback on the issue itself. |
Thank you very much for the feedback @tonybalandiuk, much appreciated. I can definitely add the section about the sig that owns the process (sig-release) and how changes can be requested (small - issue on sig-release repo, large - RFC on sig-release repo). Thanks! |
Discussing from an implementation angle in sig-release on 7/19 - My experience shows that the best way to do regression testing to ensure lack of API breakage (which is only part of making sure deprecation practices are followed). These tests don't do much other than:
Normally this is done with a mocking layer behind the API interface, but I'm unsure if that's the best approach for O3DE. |
This has been reviewed and approved by sig-release. Next step is to create a PR in the community repo. Also for next steps is to discuss with TSC making this required reading for reviewers and maintainers. |
Summary
O3DE needs a deprecation strategy to allow for APIs to be safely changed over time as well as entire features or systems to be removed.
Today there is no specific guidance around how to handle deprecation (current or future breaking changes).
To ensure stability and long-term support (LTS), clear definitions for how deprecation should be performed need to be created.
What is the relevance of this feature?
Heraclitus
Why is this important?
Having a policy in place for handling deprecation is incredibly important to help ensure necessary updates and changes to O3DE do not needlessly break downstream developers. Not doing this could hurt adoption and cause attrition over time.
What are the use cases?
Changes to public APIs can be manged more deliberately and guidance can be provided around how to remove larger features (how to perform this, how to communicate this etc...).
What will it do once completed?
Give developers guidance about how to change and remove features without negatively impacting customers. There should be a framework/run-book to follow for a variety of different situations to help steer developers down the right path.
Feature design description
A deprecation guide/policy will be created for developers to follow when making changes to O3DE. This guide will most likely exist on the O3DE wiki and will be a living document that grows and evolves overtime to meet the needs of O3DE and its customers.
Technical design description
What are the advantages of the feature?
We clearly define how developers should handle deprecation and set expectations from customers about the stability (in terms of change) of the engine they're using.
What are the disadvantages of the feature?
Being more careful and deliberate around deprecation does come with a cost to feature delivery. It will slow things down and potentially make making changes more difficult. This impacts internal O3DE development, and to an extent customers looking for future updates.
It is possible time may be wasted on unnecessary care given to deprecation that has minimal impact (if their are no downstream customers of a particular feature or API simply changing/deleting the code and sidestepping this whole process may be simpler/smarter).
Given the current lifetime of O3DE (less than a year after initial preview release) it may be too soon to commit to a deprecation policy (as few systems have fully settled/matured). This might be a policy that we define, but do not put into practice until churn on engine systems is a lot less.
How will this be implemented or integrated into the O3DE environment?
N/A
Are there any alternatives to this feature?
An alternative is to simply do nothing, but long term this will cause more harm than good (even factoring in the potential impact to velocity that comes with being more careful about making breaking changes).
It is likely the impact of constant breaking changes for customers will lead to frustration and them eventually leaving O3DE.
How will users learn this feature?
The guide will be highlighted on the O3DE wiki and publicized in Release Notes
Are there any open questions?
The text was updated successfully, but these errors were encountered: