# Contributing Guide If you want your changes to be reviewed and merged quickly, following a few key practices makes a big difference. Clear, focused, and well-structured contributions help reviewers understand your intent and ensure your improvements land smoothly. :::{seealso} This guide covers contributing to Ray Data in specific. For information on contributing to the Ray project in general, see the {ref}`general Ray contributing guide`. ::: ## Find something to work on Start by solving a problem you encounter, like fixing a bug or adding a missing feature. If you're unsure where to start: * Browse the issue tracker for problems you understand. * Look for labels like ["good first issue"](https://github.com/ray-project/ray/issues?q=is%3Aissue%20state%3Aopen%20label%3Agood-first-issue%20label%3Adata) for approachable tasks. * [Join the Ray Slack](https://www.ray.io/join-slack) and post in #data-contributors. ## Get early feedback If you’re adding a new public API or making a substantial refactor, **share your plan early**. Discussing changes before you invest a lot of work can save time and align your work with the project’s direction. You can open a draft PR, discuss on an Issue, or post in Slack for early feedback. It won’t affect acceptance and often improves the final design. ## Write good tests Most changes to Ray Data require tests. For tips on how to write good tests, see {ref}`How to write tests `. ## Write simple, clear code Ray Data values **readable, maintainable, and extendable** code over clever tricks. For guidance on how to write code that aligns with Ray Data's design taste, see [A Philosophy of Software Design](https://web.stanford.edu/~ouster/cgi-bin/aposd2ndEdExtract.pdf). ## Test your changes locally To test your changes locally, build [Ray from source](https://docs.ray.io/en/latest/ray-contribute/development.html). For Ray Data development, you typically only need the Python environment—you can skip the C++ build unless you’re also contributing to Ray Core. Before submitting a PR, run `pre-commit` to lint your changes and `pytest` to execute your tests. Note that the full Ray Data test suite can be heavy to run locally, start with tests directly related to your changes. For example, if you modified `map`, from `python/ray/data/tests` run: `pytest test_map.py`. ## Open a pull request ### Write a clear pull request description Explain **why the change exists and what it achieves**. Clear descriptions reduce back-and-forth and speed up reviews. Here's an example of a PR with a good description: [[Data] Refactor PhysicalOperator.completed to fix side effects ](https://github.com/ray-project/ray/pull/58915). ### Keep pull requests small Review difficulty scales non-linearly with PR size. For fast reviews, do the following: * **Keep PRs under ~200 lines** of change when possible. * **Split large PRs** into multiple incremental PRs. * Avoid mixing refactors and new features in the same PR. Here's an example of a PR that keeps its scope small: [[Data] Support Non-String Items for ApproximateTopK Aggregator](https://github.com/ray-project/ray/pull/58659). While the broader effort focuses on optimizing preprocessors, this change was deliberately split out as a small, incremental PR, which made it much easier to review. ### Make CI pass Ray's CI runs lint and a small set of tests first in the `buildkite/microcheck` check. Start by making that pass. Once it’s green, tag your reviewer. They can add the go label to trigger the full test suite.