-
Notifications
You must be signed in to change notification settings - Fork 71
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
Experimental Features #91
Conversation
Signed-off-by: Joe Kutner <jpkutner@gmail.com>
|
||
## Plugins | ||
|
||
A plugin system for Pack and/or Lifecycle would allow experimental features to be implemented completely outside of the CNB project. For example, a plugin could be installed to Pack with a command like: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@jkutner is this suggesting we support experimental 3rd party plugins, or do you envision a separate CNB owned repo where these experimental plugins could live?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yea, I was thinking 3rd party (where the most likely 3rd parties would be Salesforce, Paketo, etc). But not a CNB owned repo.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think a plugin system would be great independent of this RFC.
text/0000-experimental-features.md
Outdated
|
||
- *experimental feature* - any behavior or options that are likely to change before being added to the specification | ||
|
||
This proposal affects buildpack users, platform implementors, and project contributors who want to introduce experimental features into Pack or Lifecycle. Today, any significant change that impacts end-users is introduced through an RFC, which requires a successful vote by the core team before being introduced into the specification (or the Pack platform). |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I wonder if this particular mechanism for enabling experimental features is better suited to pack
than the lifecycle. Not all lifecycle features can or should be enabled with flags (think buildpack API features).
I am wondering if experimental API versions as proposed in #92 would better support this goal at the lifecycle level
# Unresolved Questions | ||
[unresolved-questions]: #unresolved-questions | ||
|
||
- How does an experimental features become a real feature (does it use the same flag/command minus the `--experimental` flag)? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Wouldn't it go through a RFC?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
i guess i don't mean the process, but the mechanics. Like, do we need to enforce that they are the same flag?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why would it need to be the same flag? If an experimental feature "graduates" it could have changes etc. from the feedback/things we learn.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I wonder if we need an experimental flag? I don't know how golang supports external plugins, but I can envision the command just being added to the existing list of commands, and the user would use it as any other command. We could then mark experimental commands in the help menu or introduce an additional command to list all the experimental commands that have been installed (probably might want to do this anyway so users can quickly identify and remove any experimental commands).
Available Commands:
build Generate app image from source code
*grow-bones (experimental) Some custom experimental thingy
rebase Rebase app image with latest run image
inspect-image Show information about a built image
set-run-image-mirrors Set mirrors to other repositories for a given run image
set-default-builder Set default builder used by other commands
[drawbacks]: #drawbacks | ||
|
||
- End users may become tied to features that eventually go away or significantly change | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The big concern I have with this is creating a set of "hidden" APIs that people depend on if we do decide to take it away.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I agree. This seems like an unsustainable path of where we're having to constantly consider the ramification of making breaking changes to experimental features while developing mainstream features. After all, we're not exactly a stable project per se. Maybe once we achieve 1.0.0
is won't be as much of a concern.
|
||
- End users may become tied to features that eventually go away or significantly change | ||
|
||
# Alternatives |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What about experimental features that use RFCs but just for the subteam?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Personally I think experimental features in the lifecycle should typically (but not always) have RFCs b/c of the lifecycle's place in the overall architecture. However I don't RFCs should be necessary (most of the time) for experimental pack features.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
But generally I think we should trust the judgement of maintainers when deciding whether an RFC is a good idea for an experimental feature.
I like the idea of a lighter weight process for experimental. It shouldn't need to go through the same rigor, but I do wonder if it still needs to be documented and captured in a single place. Should experiments have end dates of make or break? This reminds me of spike docs we have internally at salesforce that it's an experiment that's documented, what you want to learn and find out, and for how long. My big fear is having a collection of experimental features that exist years from now. |
# Prior Art | ||
[prior-art]: #prior-art | ||
|
||
- Rust's [Unstable features](https://doc.rust-lang.org/rustdoc/unstable-features.html) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
FWIW, unstable features in rust (mostly) go through RFCs
A plugin system for Pack and/or Lifecycle would allow experimental features to be implemented completely outside of the CNB project. For example, a plugin could be installed to Pack with a command like: | ||
|
||
``` | ||
$ pack install-plugin skele-gro |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍 to the HP reference 🧹
Signed-off-by: Joe Kutner <jpkutner@gmail.com> Co-authored-by: Javier Romero <rjavier@vmware.com>
Signed-off-by: Joe Kutner <jpkutner@gmail.com> Co-authored-by: David Freilich <dfreilich@vmware.com>
Signed-off-by: Joe Kutner <jpkutner@gmail.com>
@ekcasey Can you please weigh in on the new changes? |
text/0000-experimental-features.md
Outdated
# How it Works | ||
[how-it-works]: #how-it-works | ||
|
||
Experimental features can be submitted as a PR or discussed in Github Issues on the relevant project. The team that maintains that project can decide whether or not to introduce the feature as long as it is behind a mechanism that enables or disables these features. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would also add that this mechanism needs to make it clear this is experimental, can change, etc.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Circling back to this. I'm behind the motivation, but I still have some concerns.
- Experiments that are experiments forever. At Heroku, we've had features that never shipped for GA, but essentially were GA since so many people ended up using it. Experiments should have an end goal to graduate/sunset.
- The "mechanism" needs to make it clear to users that this is experimental and unsupported.
Definitely agree with @hone's points. Some suggestions to make this a bit more rigorous/help with it:
As a side note, as part of this we should consider:
|
From conversations with @dfreilich and @jkutner, I'm going to take this over to do some edits. I'm going to move this into draft while I re-work it. |
[drawbacks]: #drawbacks | ||
|
||
- End users may become tied to features that eventually go away or significantly change | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I agree. This seems like an unsustainable path of where we're having to constantly consider the ramification of making breaking changes to experimental features while developing mainstream features. After all, we're not exactly a stable project per se. Maybe once we achieve 1.0.0
is won't be as much of a concern.
# Unresolved Questions | ||
[unresolved-questions]: #unresolved-questions | ||
|
||
- How does an experimental features become a real feature (does it use the same flag/command minus the `--experimental` flag)? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I wonder if we need an experimental flag? I don't know how golang supports external plugins, but I can envision the command just being added to the existing list of commands, and the user would use it as any other command. We could then mark experimental commands in the help menu or introduce an additional command to list all the experimental commands that have been installed (probably might want to do this anyway so users can quickly identify and remove any experimental commands).
Available Commands:
build Generate app image from source code
*grow-bones (experimental) Some custom experimental thingy
rebase Rebase app image with latest run image
inspect-image Show information about a built image
set-run-image-mirrors Set mirrors to other repositories for a given run image
set-default-builder Set default builder used by other commands
$ pack build --with-bone-growth | ||
``` | ||
|
||
Such a plugin mechanism would require a well defined plugin-interface, and versioning of that interface. This is a significantly larger project that the current proposal. However, the current proposal does not prevent a plugin system from being introduced later on. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is definitely something to consider. Especially the work to maintain the integrity of the interface and how much effort we're willing to put into make sure we don't break the interface and any plugins.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would mark plugins as out of scope.
I like the idea of having an expiration date associated with an experiment to hold us to either adopting or sunsetting it. I just wonder what criteria would we follow to determine the end result of an experimental feature? Do we somehow poll how much it's being used in the community or by how valuable the subteams find it to be? |
That's definitely the hard question. I don't want to codify it too much since I'm not on the subteam, and I trust the team will figure out what will work over time vs. my ivory tower. |
Signed-off-by: Terence Lee <hone02@gmail.com>
Signed-off-by: Terence Lee <hone02@gmail.com>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🔥
I like @elbandito's suggestion of explicitly calling out experimental
in the help test for an experimental command/flag.
@dfreilich yeah that's great, would you want me to add this to the RFC? |
I vote ✅ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
TBH I am not convinced we need an RFC for this. pack
already has experimental features. I would be happy to see improvements like:
- label experimental features clearly in the help text
- warning text when experimental features are used
- easier and more discoverable UX to toggle on/off experimental features
- a process for checking in on existing experimental features and ensure we are removing and or promoting them when appropriate
However, I think we could address the above through a series of pack issues. I am leery about introducing a new/different formal voting process for experimental features. It would add logistical hurdles that feel potentially unnecessary.
|
||
End-users and early adopters of CNB have real problems that need to be solved by the CNB project. Sometimes these problems prevent them from adopting CNB in their organizations. Our RFC process, specification guidelines, and governance structure provide a strong mechanism through which we can enact change and solve problems; but sometimes it's too heavy and inhibits experimentation. | ||
|
||
We need a way to introduce experiments before writing an RFC. Such a mechanism would allow us to deliver new capabilities faster, improve our means of collecting real end-user feedback, and improve the quality of our RFCs. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Doesn't pack
already have experimental features? I think the UX around pack experimental features could maybe use some improvement, but they do exist.
I share @ekcasey's sentiment, initially this RFC included lifecycle experimental features which in that vein would require additional discussion. Now that it's been removed I'm failing to see the purpose of this RFC given that it's essentially what we are currently doing. I also agree with the suggested improvements but as mentioned could be tackled as individual pack issues. The only specific call out I see in this RFC is the formal acknowledgement allowing for "experimental features without requiring a specification, core team review, or RFC". Another benefit to this RFC is recognizing and discussing alternatives. In which I'd like to emphasize @elbandito's concerns about the added complexity of maintaining an additional interface and distributing the plugins themselves.
We would need to be very methodical on how that would be implemented that it's probably not worth the effort for this specific use case. |
@ekcasey I'm happy to cut out any "voting"/formality. The suggestions listed above make up the bulk of my proposal of providing a bit more rigor around "experiments" to ensure both clarity and they are indeed experiments and not secret features that live on forever. These are the things I care the most about. |
@jromero I'm not entirely sure what you're suggesting. I do think the callout of not requiring experimental features to go through the RFC process is a change and the point of this RFC. As far as plugins, I do like that idea, but think they're out of scope of the intent of this RFC. |
I met with @jromero and we decided to park/close this RFC for now. While we're on the same page of what I wanted to achieve with this proposal, but it's not something that is needed right now. Instead, we believe this need is worth revisiting after |
Readable