Skip to content
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

Closed
wants to merge 6 commits into from
Closed

Experimental Features #91

wants to merge 6 commits into from

Conversation

jkutner
Copy link
Member

@jkutner jkutner commented Jul 7, 2020

Signed-off-by: Joe Kutner <jpkutner@gmail.com>
@jkutner jkutner requested a review from a team as a code owner July 7, 2020 17:36

## 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:
Copy link
Member

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?

Copy link
Member Author

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.

Copy link
Member

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.


- *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).
Copy link
Member

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)?
Copy link
Member

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?

Copy link
Member Author

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?

Copy link
Member

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.

Copy link
Member

@elbandito elbandito Sep 10, 2020

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

Copy link
Member

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.

Copy link
Member

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
Copy link
Member

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?

Copy link
Member

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.

Copy link
Member

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.

@hone
Copy link
Member

hone commented Jul 15, 2020

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)
Copy link
Member

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

text/0000-experimental-features.md Outdated Show resolved Hide resolved
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
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 to the HP reference 🧹

text/0000-experimental-features.md Outdated Show resolved Hide resolved
@nebhale nebhale requested review from dfreilich, elbandito, hone, ekcasey and a team July 28, 2020 15:10
jkutner and others added 3 commits July 30, 2020 07:56
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>
@nebhale
Copy link
Contributor

nebhale commented Aug 12, 2020

@ekcasey Can you please weigh in on the new changes?

@nebhale nebhale requested a review from jromero August 12, 2020 19:15
# 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.
Copy link
Member

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.

Copy link
Member

@hone hone left a 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.

@sclevine sclevine self-requested a review August 26, 2020 19:10
@nebhale nebhale requested review from a team and removed request for a team August 26, 2020 19:10
@dfreilich
Copy link
Member

Definitely agree with @hone's points. Some suggestions to make this a bit more rigorous/help with it:

  • We should have a tracking issue in the relevant repo for any given experiment. Something that says what it is, what we are trying to prove, when we hope to know it by, and which allows for feedback. (@hone thought it should be fairly short, like 3 sentences total)
  • It could be useful, as such, to have an expiration/suggested expiration date for an experiment. Something like 2 releases in the future, though we could adjust it on a case-by-case basis
  • Currently, we don't really have explicit logs if you are using an experimental feature. Perhaps we should have a warning log, after a command concludes, with a message that you used this experimental feature
  • If we do have more explicit logging, and a tracking issue, we should print the issue as part of the logs, and invite users to give feedback on the issue, or at least tell us whether they used it, and whether they liked it.

As a side note, as part of this we should consider:

  • Make it easier to flip the experimental switch in your config (i.e., have a command pack config experimental/pack config experimental true and pack config experimental false), to make this more discoverable for users
  • Document experimental features (Document experimental feature docs#141), and probably have a tracking document in pack with a list of running experiments

@hone hone self-assigned this Sep 9, 2020
@hone
Copy link
Member

hone commented Sep 9, 2020

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.

@hone hone marked this pull request as draft September 9, 2020 23:39
[drawbacks]: #drawbacks

- End users may become tied to features that eventually go away or significantly change

Copy link
Member

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)?
Copy link
Member

@elbandito elbandito Sep 10, 2020

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.
Copy link
Member

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.

Copy link
Member

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.

@elbandito
Copy link
Member

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.

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?

@hone
Copy link
Member

hone commented Sep 10, 2020

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.

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>
@hone hone marked this pull request as ready for review September 15, 2020 22:44
Copy link
Member

@dfreilich dfreilich left a 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.

@hone
Copy link
Member

hone commented Sep 23, 2020

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?

@hone
Copy link
Member

hone commented Sep 23, 2020

Would love a re-review since my changes from @ekcasey @nebhale @jromero and not sure but @jkutner should vote somehow.

@hone hone requested review from nebhale, ekcasey and jromero September 23, 2020 15:12
@jkutner
Copy link
Member Author

jkutner commented Sep 23, 2020

I vote ✅

Copy link
Member

@ekcasey ekcasey left a 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:

  1. label experimental features clearly in the help text
  2. warning text when experimental features are used
  3. easier and more discoverable UX to toggle on/off experimental features
  4. 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.
Copy link
Member

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.

@ekcasey ekcasey self-requested a review October 14, 2020 19:14
@jromero
Copy link
Member

jromero commented Oct 19, 2020

TBH I am not convinced we need an RFC for this. pack already has experimental features. I would be happy to see improvements like:

  1. label experimental features clearly in the help text
  2. warning text when experimental features are used
  3. easier and more discoverable UX to toggle on/off experimental features
  4. 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.

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.

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.

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.

@hone
Copy link
Member

hone commented Oct 20, 2020

TBH I am not convinced we need an RFC for this. pack already has experimental features. I would be happy to see improvements like:

1. label experimental features clearly in the help text

2. warning text when experimental features are used

3. easier and more discoverable UX to toggle on/off experimental features

4. 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.

@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.

@hone
Copy link
Member

hone commented Oct 20, 2020

@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.

@hone
Copy link
Member

hone commented Oct 28, 2020

@jromero after talking with @ekcasey, let's find time to chat about this RFC. I'm happy to close this if we think it's unnecessary, but my biggest concern is making sure experimental features don't languish/have an end date.

@hone
Copy link
Member

hone commented Nov 3, 2020

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 pack hits 1.0 where backwards breaking changes will become harder.

@hone hone closed this Nov 3, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants