Code review can be better 🔥 Горячее 💬 Длинная дискуссия
Код-ревью можно улучшить
Мы отложили эксперимент с git-review
— инструментом, который делает ревью коммитом поверх PR.
Проблемы GitHub:
- состояние ревью не хранится в репозитории;
- всё через веб, с лагами и лишними кликами.
Локальный workflow
Я клонирую ветку, сбрасываю её, чтобы код выглядел «моим», и ревью в Magit: запускаю тесты, перехожу к определениям, помечаю файлы через git add -p
.
Но оставлять замечания приходится в браузере: долго, неудобно, текстовое поле тормозит.
Идея git-review
- ревью = коммит с комментариями вида
// CR(name): …
; - автор и ревьюер редактируют этот коммит (
--force-with-lease
); - по окончании добавляется revert-коммит, сохраняя историю.
Почему не зашло
Комментарии в коде — супер, но:
- если меняешь код, комментарии смещаются и конфликтуют;
--force-with-lease
добавляет трения;- нужен более мягкий merge для ревью, а не строгая цепочка хэшей.
Довести до ума потребовало бы >500 строк «быстрого хака».
К тому же, в upstream-git может появиться Change-Id в стиле Gerrit, что изменит ландшафт.
Комментарии (201)
- Основная боль: ревью приходит слишком поздно, заставляя переписывать всё с нуля.
- Решения: локальное ревью в IDE (IntelliJ, VS Code), stacked-PR, «reviewer merges»-подход.
- Инструменты: Gerrit, Phabricator, Graphite, GitButler, SourceHut, GitPatch, Tangled.
- Надёжный Change-ID в Git обещает фиксить проблемы с force-push и interdiff.
- Культура важнее инструментов: мелкие, самостоятельные коммиты, RFC-прототипы, совместное проектирование до кода.
Improvements to OCaml code editing: the basics of a refactor engine
-
Цель стажировки – заложить основу для системы рефакторинга в Merlin, вдохновлённой IntelliJ и Gleam.
-
Первый эксперимент – команда «вынести выражение на верхний уровень» (extract to toplevel).
-
Как работает
- Выделяется наибольшее выражение внутри выбранного фрагмента.
- Оно переносится в новое
let
-связывание на уровень выше. - Если выражение не чистое, создаётся thunk
unit -> …
, чтобы сохранить семантику. - Свободные переменные превращаются в параметры новой функции.
-
Примеры
- Константа
3.14159
→let const_name1 = 3.14159
. print_endline
внутри блока → оборачивается вfun () -> …
.a + b + c + (c * x * y) + z
→ функция, принимающаяx, y, a, b, c
.
- Константа
-
Результат – работающий прототип, готовый к расширению другими командами.
Комментарии (16)
- Участники рады появлению базового рефакторинга «extract expression» и обсуждают, какие более продвинутые преобразования (например, map ↔ for) хотели бы видеть.
- Уточняли, будет ли автоматически заменяться одинаковый код в той же области видимости: пока нет, чтобы не «угадать» намерения пользователя.
- Кто-то делится самописными vim-скриптами для поиска и рефакторинга, работающими на любом языке.
- Поднимался вопрос о поддержке VS Code: разработчики утверждают, что вкладывают время и в VS Code, и в Emacs, но Emacs проще расширять.
- Обсуждали родство OCaml и F#, а также возможность использования ИИ для крупных рефакторингов.