| .. Licensed to the Apache Software Foundation (ASF) under one | |
| or more contributor license agreements. See the NOTICE file | |
| distributed with this work for additional information | |
| regarding copyright ownership. The ASF licenses this file | |
| to you under the Apache License, Version 2.0 (the | |
| "License"); you may not use this file except in compliance | |
| with the License. You may obtain a copy of the License at | |
| .. http://www.apache.org/licenses/LICENSE-2.0 | |
| .. Unless required by applicable law or agreed to in writing, | |
| software distributed under the License is distributed on an | |
| "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| KIND, either express or implied. See the License for the | |
| specific language governing permissions and limitations | |
| under the License. | |
| .. _code_review_guide: | |
| Code Reviews | |
| ============ | |
| .. contents:: | |
| :depth: 2 | |
| :local: | |
| Open source code is maintained by a community with diverse backgrounds, interests, and goals. | |
| Hence it is important to provide clear, documented and maintainable code and processes. Code reviews are a | |
| shepherding process used to collectively spot potential problems, improve quality of the code, and educate both contributors | |
| and reviewers about the code base and its assumptions. It is also one mechanism to ensure there are multiple people who can | |
| maintain a related piece of code together. Contributors are encouraged to polish the code to a reviewable | |
| state before requesting reviews. This is especially important for committer candidates, as committers are expected | |
| to participate in not only writing code but also reviewing it. | |
| This document is a living guideline for code review in open source. Please also take sometime to read | |
| :ref:`community_guide` about the general development process. | |
| Building Trust | |
| -------------- | |
| First and foremost, we are building a community that based on trust, which takes time | |
| and effort to both build and maintain. We expect our community members to work together in a | |
| constructive way and work together with common sense. Although we all have different sets of backgrounds, | |
| interests and goals we must work together to find solutions that work for the larger community. | |
| Trust-based collaboration is also a key tenant of the Apache way and an important factor to consider in growing the community, | |
| and promoting members to official roles. | |
| Community Participation | |
| ----------------------- | |
| Everyone is welcomed to comment on PRs. We encourage committers to wait for some period of time(e.g. three days) | |
| before merging PR that contains a major architecture change. The goal is to give people time to speak up and | |
| express interest in reviewing and participate. | |
| Remembering that we are all coming from different backgrounds is important here. For example some community members | |
| work in different time zones, only work on open source during work hours, or may be traveling or having other events | |
| going on in their lives. An important part of working in a large project is ensuring there is collective understanding, | |
| so no one person is a bottleneck. While it is important to allow time for participation in code review we also can not | |
| block all changes on all reviewers. Remember that helping people land PRs is a great way to encourage broader | |
| participation, especially for those who volunteer their time to contribute. | |
| Part of this is trusting and communicating with fellow maintainers that if changes need to be applied in the future | |
| that PR authors will later follow through on their promises. It is the responsibility of committers to listen to all | |
| feedback whether from PMC members or new contributors and consider what actions need to be taken. | |
| Read the code carefully | |
| ----------------------- | |
| Sometimes we may quickly read through the code and only pick up on a selective aspects of the code. These type of comments | |
| are usually helpful and should be welcomed in the community. However, they are only part of performing code review and | |
| should be part of more comprehensive feedback. A good and careful code review is a large time investment and sometimes | |
| can be longer than writing the actual contribution. | |
| For example receiving only highly critical feedback on minor aspects of your PR rarely feels good, and it can be discouraging | |
| if your time and effort was not reciprocated during review. Practicing empathy when acting both as a contributor and committer | |
| is important and can help make you a more effective code reviewer and contributor. | |
| We expect that all committers carefully read and understand the code before signing off. There is a lot of trust involved when | |
| a committer hits the merge button. In the meantime, we acknowledge that sometimes problems slip through, in that case, the | |
| merger is responsible for ensuring the correct follow up actions are taken. | |
| Be Respectful | |
| ------------- | |
| - To everyone who are making comments: making constructive comment will help new contributors to land their PRs | |
| timely and help us welcome new members to the community. | |
| - To authors: reviewers should spend significant time reading the code, and a careful review could be as time intensive | |
| as writing the code from scratch. Respectfully address review comments and reciprocate the review by helping review | |
| others changes in the future. | |
| Most importantly focus on having a constructive conversation, and try to assume best intentions when interacting as a reviewer. | |
| If there is something in the process not working, consider getting some face time with the other contributors and discussing | |
| how to improve the process or communication. | |
| Factors to Consider about Code Quality | |
| -------------------------------------- | |
| High quality code is critical to the long term success of the project. There are many factors of code quality to consider | |
| during a code review: | |
| - F0: Overall architecture. This includes the definition of public modules, key data structures and public interfaces. | |
| Good architectural choices are critical to the success of the project in the long run. | |
| - F1: Architectural consistency. There are usually multiple ways to implement a new feature. We must ensure new | |
| features are consistent with previous overall architectural choices and interact well with the existing code. | |
| Every new feature increases the complexity of the project, and a consistent design ideally minimizes the increase | |
| in complexity bought by a new feature, making it easier to maintain code in the long run. | |
| - F2: Code robustness and test coverage. Ensure code runs correctly in all possible settings(platforms), ensure | |
| test coverage of the new feature. Clear error messages for user facing errors. | |
| - F3: User facing API documentation: documentation of public user facing APIs and key module interfaces are mandatory. | |
| This includes the API, data structures that appears in the public interface (i.e., `include/tvm` and user facing python APIs). | |
| We generally encourage well documented code and include some form of documentations for internal APIs that are used in | |
| multiple places, see also F4. | |
| - F4: Code readability. Readability involves multiple aspects: instructive and consistent function names, clear implementation | |
| of the overall flow, descriptive comments for complex code logic and internal functions. Readable code is easier to maintain. | |
| Architectural design and consistency are the most important factors since they are likely to introduce the most long term technical debt. | |
| As a result, committers should most carefully consider these factors before merging the code. | |
| Test coverage and API documentation are expected for code contributions. | |
| Code readability is relatively a subjective matter compared to the other ones. | |
| Different people have different thoughts on how to best write code. Reviewers should make constructive and actionable comments. | |
| In the meantime, code review should not be used as a way to get others to write code exactly the way you would. | |
| Conversely you should also consider that what you may easily understand, or find acceptable might not work for the larger | |
| community or other members. Use your judgment on what is appropriate based on the content and the scope of the contribution | |
| and where the contributor is coming from. | |
| We follow common :ref:`code_guide` when writing code. Style guides help ensure that code is readable and maintainable by others, | |
| long after the original author has moved on. Style guides are more than about code formatting — they also pertain | |
| to the correct way to document code, variable naming, and other conventions that are not enforced by automatic formatters. | |
| Consensus Building | |
| ------------------ | |
| Disagreements can happen during code reviews. We encourage building consensus among the people involved. We are working together | |
| and building trust with each other in OSS. The nature of OSS means sometimes we make compromises on less significant issues to | |
| make steady progress and welcome broader participation in the community. Compromise unfortunately means sometimes the world will | |
| not be exactly as we would like, this true even for leaders of the community. | |
| - Be civil and build consensus through constructive technical-based conversations. | |
| - A committer who owns the area can serve as a shepherd to drive the discussion by taking all the conversations into consideration, | |
| and suggest a resolution with to move forward. | |
| - Because a lot of trust is involved on the committer(shepherd), they should read the PR carefully before sign off. Additionally, | |
| the merger should also take the responsibility to followup in case there are problems caused by the merge. | |
| Consistency | |
| ----------- | |
| A final remark is that we are all human and its hard to always be perfectly consistent. If contributors feel that you didn't apply these guidelines | |
| in a consistent way it is important to listen and hear folks out. We will constantly have to iterate on processes and guidelines as we evolve as a community. | |
| Our goal is to strive to be consistent and objective but all of us are unfortunately human and imperfect and will need to adjust and learn. | |
| Additional Recommendations | |
| -------------------------- | |
| Deliberate on API and Data Structures | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
| A minimum and stable API is critical to the project’s life. A good API makes a huge difference. Always think very carefully about all the aspects including naming, argument definitions and behavior. | |
| When possible, pay more attention still to the proposed API design during code reviews. | |
| Remember, it is easier to improve code implementation, but it is extremely hard to change an API once accepted. | |
| We should treat data structures that are shared across modules(e.g. AST) in the same way. | |
| If/when uncertain, start a conversation with more developers before committing. | |
| Here are some useful principles for designing APIs: | |
| - Be consistent with existing well-known package’s APIs if the features overlap. | |
| For example, tensor operation APIs should always be consistent with the numpy API. | |
| - Be consistent with existing APIs in the same project. | |
| For example, we should use the same argument ordering across all the optimization passes, | |
| so there is no "surprise" when using them. | |
| - Think about whether the API will change in the future. | |
| For example, we will have more options like loop_unrolling and device placement policy | |
| as we add more optimizations in build. We can package optimization knobs into a build | |
| configuration object. In this way, the build API is stable over time, even though it may be enriched. | |
| - Write documentation. Documentation is mandatory for APIs and sometimes writing documents helps | |
| us to think further about the design as well as whether we need to add further clarifications. | |
| - Minimum. Think about how many lines of code a user has to write to use the API. | |
| Remove layers of abstraction when possible. | |
| Minimize Dependencies | |
| ~~~~~~~~~~~~~~~~~~~~~ | |
| Always be cautious in introducing dependencies. While it is important to reuse code and avoid reinventing the wheel, | |
| dependencies can increase burden of users in deployment. A good design principle is that a feature or function | |
| should only have a dependency if/when a user actually use it. | |
| Concise Implementation | |
| ~~~~~~~~~~~~~~~~~~~~~~ | |
| Some basic principles applied here: favor vectorized array code over loops, use existing APIs that solve the problem. | |
| Document Lessons in Code Reviews | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
| When you find there are some common or recurring lessons that can be summarized, | |
| add it to the :ref:`code_guide`. | |
| It is always good to refer to the guideline document when requesting changes, | |
| so the lessons can be shared to all the community. | |
| Learn from other Code Reviews | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
| There can be multiple reviewers reviewing the same changes. Many times other reviewers | |
| may spot things you did not find. Try to learn from other code reviews, when possible, document these lessons. | |
| Approve and Request Changes Explicitly | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
| The contributor and code owner can request code reviews from multiple reviewers. | |
| Remember to approve changes when your comments are addressed in a code review. | |
| To do so -- please click on changes tab in the pull request, then select approve, | |
| or comment on the code and click request changes. | |
| Code owner can decide if the code can be merged in case by case if some of the reviewers | |
| did not respond in time(e.g. a week) and existing reviews are sufficient. | |
| Reviewers | |
| ~~~~~~~~~ | |
| Reviewers should strive to leave timely feedback on pull requests for which their | |
| review was requested. Reviewing code is an important part of the project's health | |
| and should be considered a regular responsibility for contributors. Automated | |
| tooling helps out in this regard, as PRs with no activity for a set amount of | |
| time will get a bot comment pinging the relevant parties. |