Sebastian Berg
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights
    • Engagement control
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Versions and GitHub Sync Note Insights Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       owned this note    owned this note      
    Published Linked with GitHub
    Subscribed
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    Subscribe
    # Process for deciding on deprecations and breaking changes Assessing impact ---------------- Here "impact" means how unmodified code may be negatively affected by a change ignoring any deprecation period. To get an idea about how much impact a change has, try to list all potential impacts. This will often be just a single item (user of function `x` has to replace it with `y`), but it could be multiple different ones. Ideally *after* listing all potential impacts rank them on the following two scales (do not yet think about how to make the transition easier): 1. **Severity** (How bad is the impact for an affected user?) - Minor: A performance regression or change in (undocumented) warning/error category will fall here. This type of change would normally not require a deprecation cycle or special consideration. - Typical: Code must be updated to avoid an error, the update is simple to do in a way that works both on existing and future NumPy versions. - Severe: Code will error or crash, and there is no simple work around or fix. - Critical: Code returns incorrect results. A change requiring massive effort may fall here. A hard crash (e.g. segfault) in itself is not necessarily critical, it is much less severe than a silent change. 2. **Likelihood** (How many users does the change affect?) - Rare: Change has very few impacted users (or even no known users after a code search). The normal assumption is that there is always someone affected, but a rarely used keyword argument of an already rarely used function may fall here. - Limited: Change is in a rarely used function or function argument. Another possibility is that it affects only a small group of very advanced users. - Common: Change affects a bigger audience or multiple large downstream libraries. - Ubiquitous: Change affects a large fraction of NumPy users. The categories will not always be perfectly clear. That is OK. Rather than establishing precise guidelines, the purpose is a structured *processes* that can be reviewed. When the impact is exceptionally difficult to assess, it is often feasible to try a change on the development branch while signalling willigness to revert it. Downstream libraries test against it (and the release candidate) which gives a chance to correct an originally optimistic assessment. After assessing each impact, it will fall somewhere on the following table: Severity\Likelyhood | Rare | Limited | Common | Ubiquitous --------------------|------|---------|--------|----------- **Minor** | ok | ok | ok? | **Typical** | ok? | | | no? **Severe** | | | no? | no **Critical** | no? | no | no | no Note that all changes should normally follow the two release deprecation warning policy (except "minor" ones). The "no" fields means a change is clearly unacceptable, although a NEP can always overrule it. This table only assesses the "impact". It does not assess how the impact compares to the benefits of the proposed change. This must be favourable no matter how small the impact is. However, by assessing the impact, it will be easier to weigh it against the benefit. (Note that the table is not symmetric. An impact with "critical" severity is rarely considered even when _no_ known users are impacted.) ### Mitigation and arguing of benefits Any change falling outside the "ok" fields requires careful consideration. When an impact is larger, you can try to mitigate it to "move" on the table. Some possible reasons for this are: * An avoidable warning for at least two releases (the policy for any change that modifies behaviour) reduces a change one category (usually from "typical" to "minor" severity). * The severity category may be reduced by creating an easy work around (i.e. to move it from "sever" to "typical"). * Sometimes a change may break working code, but also fix _existing_ bugs, this can offset the severity. In extreme cases, this may warrant classifying a change as a bug-fix. * For particularly noisy changes (i.e. ubiquitous category) considering fixing downstream packages, delay the warning (or use a `PendingDeprecationWarning`). Simply prolonging the the deprecation period is also an option. This reduces how many users struggle with the change and smoothens the transition. * Exceptionally clear documentation and communication could be used to ensure that the impact is more acceptable. This may not be enough to move a "category" by itself, but helps. After mitigation, the benefits can be assessed: * Any benefit of the change can be argued to "offset" the impact. If this is necessary, a broad community discussion on the mailing list is required. It should be clear that this does not actually "mitigate" the impact but rather argues that the benefit outweighs it. These are not a fixed set of rules, but provide a framework to assess and then try to mitigate the impact of a proposed change to an acceptable level. Arguing that a benefit can overcome multiple "impact" categories may require exceptionally large benefits, and most likely a NEP. For example a change with an initial impact classification of "severe" and "ubiquitous" is unlikely to even be considered unless the severity can be reduced. Many deprecations will fall somewhere below or equal to a "typical and limited" impact (i.e. removal of an uncommon function argument). They recieve a deprecation warning to make the impact acceptable with a brief discussiong that the change itself is worthwhile (i.e. the API is cleaner afterwards). Any more disruptive change requires broad community discussion. This needs at least a discussion on the NumPy mailing list and it is likely that the person proposing it will be asked to write a NEP. ### Summary and reasoning for this processess The aim of this process and table is to provide a loose formalism with the goal of: * *Diligence:* Following this process ensures detailed assessment of its impact without being distracted by the benefits. This is achieved by following well defined steps: 1. Listing each potential impact (usually one). 2. Assessing the severity. 3. Assessing the likelihood. 4. Discussing what steps are/can be taken to lower the impact *ignoring any benefits*. 5. If the impact is not low at this point, this should prompt considering and listing of alternatives. 6. Argue that the benefits outweigh the remaining impact. (This is a distinct step: the original impact assessment stands as it was.) * *Transparency:* Using this process for difficult decisions makes it easier for the reviewer and community to follow how a decision was made and criticize it. * *Nuance:* When the it is clear that an impact is larger than typical this will prompt more care and thought. In many cases it may also clarify that a change has lower impact than expected on first sight. * *Experience:* Using a similar formalism for many changes makes it easier to learn from past decisions by providing an approach to compare and conceptualize them. We aim to follow these steps in the future for difficult decisions. In general, any reviewer and community member may ask for this process to be followed for a proposed change, if the change is difficult, it will be worth the effort. If it is very low impact it will be quick to clarify why. NOTE: At this time the process is new and is expected to require clarification. Examples -------- It should be stressed again, that the categories will rarely be clear and intentially are categorized with some uncertainty below. Even unclear categories can help in forming a more clear idea of a change. ### Histogram The "histogram" example doesn't really add much with respect to this process. But noting the duplicate effort/impact would probably move it into a more severe category than most deprecations. That makes it a more difficult decision and indicates that careful thought should be spend on alternatives. ### Integer indexing requirement * Severity: Typical--Severe (although fairly easy, users often had to do many changes) * Likelihood: Ubiquitous How ubiquitous it really was became probably only clear after the (rc?) release. The change would now probably go through a NEP as it initially falls into the lower right part of the table. To get into the "acceptable" part of the table we note that: 1. Real bugs were caught in the processes (argued to reduce severity) 2. The deprecation was delayed and longer than normally (argued to mitigate the number of affected users by giving much more time) Even with these considerations, it still has a larg impact and clearly requires careful thought and community discussion about the benefits. ### Removing financial functions * Severity: Severe (on the high end) * Likelihood: Limited (maybe common) While not used by a large user base (limited), the removal is disurptive (severe). The change ultimately required a NEP, since it is not easy to weigh the maintainence advantage of removing the functions against the impact to their users. The NEP included the reduction of the severity by providing a work-around: A pip installable package as a drop-in replacement (reducing the severity). For heavy users of these functions this will still be more severe than most deprecations, but it lowered the impact assessment enough to consider the benefit of removal to outweigh the impact.

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully