2 ポイント 投稿者 GN⁺ 2024-07-26 | 1件のコメント | WhatsAppで共有
  • HaystackはPRの会話履歴と変更内容をあわせて読み、実際に人の判断が必要な変更だけをレビュアーに回すコードレビューツールとして提示されている
  • 問題のないPRは自動マージし、危険なPRは選別対象として分類して、「human code review time to zero」に近いフローを目指す
  • 例のPRではtenancyInit()cacheWarmup()Promise.all()で並列化し、コールドスタートを約4秒から2.4秒に短縮したが、過去の実行順序の決定を覆している
  • Haystackは会話履歴から、cacheWarmuptenancyInitの後に実行されるべきだという根拠を見つけ、サンドボックスで50回の起動中31回クラッシュしたことを確認する
  • 問題のあるPRは元の順序を決めた@mayaに渡され、壊れた設計判断と失敗結果がPRに添えられることで、レビュー判断にかかる時間を減らす

PRレビューを自動選別するフロー

  • HaystackはすべてのPRの会話履歴と変更内容を読み、リスクを判断する
  • 危険なPRはエンドツーエンドで実行して検証し、人の判断が必要なときだけレビュアーを巻き込む
  • 画面には16件のPRをHaystackが選別している様子が表示される
    • TypeScript、JavaScript、C、Python、Ruby、Go、C++など複数言語のPRが並ぶ
    • 各PRはanalyzing状態で表示される

危険な変更の例: サービスブートストラップの並列化

  • 例のPR platform#3120 feat: parallelize service bootstrap は、サービスのブートストラップ段階を並列化する変更である
  • 既存コードではtenancyInit()を実行したあと、cacheWarmup()を順次実行する
  • 変更後のコードでは、2つの作業をPromise.all([tenancyInit(), cacheWarmup()])で同時に実行する
  • PR説明によれば、コールドスタートは約4秒まで伸びていたが、並列化後は約2.4秒に短縮された
  • 既存テストはすべて通過するため、表面的には承認しやすい性能改善に見える

会話履歴から明らかになった設計判断

  • HaystackはPRの背後にある履歴を読み、この変更が過去の設計判断を覆していることを見つける
  • @mayaは、cacheWarmupが空の設定を読まないように、tenancyInitが先に完了すべきだと求めていた
  • テストスイートにはこの実行順序を検証する項目がないため、回帰がテストを通過してしまう
  • Haystack reviewはPRに次の情報を添える
    • 会話履歴に残っている判断
    • 現在のPRが実際に変更する動作
    • テストが通過した理由

実行検証と失敗結果

  • Haystackはコードを読むだけで止まらず、変更を実際に実行する
  • 会話履歴がテストにないタイミング競合を示しているため、サンドボックスでサービスを50回起動する
  • 50回のうち31回で、cacheWarmuptenancyInit完了前に空の設定を読んでしまう
  • その結果、サービスは最初のリクエストで例外を投げてクラッシュする
  • Haystack QAは、実行した理由、実施したテスト、壊れた箇所をPRにあわせて表示する

人によるレビューが必要なポイント

  • HaystackはこのPRを自動マージせず、元の実行順序を決めた@mayaを参加させるよう推奨する
  • PRには壊れた設計判断と失敗した起動結果があわせて表示される
  • レビュー画面には「Request review」「Chat with @maya」「Doesn’t need review」といった選択肢が表示される
  • Haystackのフローは、大半のPRを自動マージし、例のような危険な変更だけを適切な人に回すことに焦点を当てている

1件のコメント

 
GN⁺ 2024-07-26
Hacker News の意見
  • AI 機能についてはよく分からないが、キャンバス上でコード作業をし、フローチャート UI も併用するという考え方は、ずっと前から望んでいたもの
    主にデータ処理をしていて、パイプラインを説明したり自分で理解したりするためにフローチャートをよく描く
    こういう方向性の開発 UI があれば、CS 専攻ではない人たちが作った扱いにくいコードベースを相手にするのに良さそう

    • LabView のようなツールを思い浮かべているのですか?
      https://www.ni.com/en/shop/labview.html
    • Java で BlueJ がやっている方式に近いのですか?
    • 直面している問題は、データフローを可視化することなのか、制御フローを可視化することなのか気になる
    • 同じキャンバス内でダイアグラムとコードを一緒にスケッチできたら素晴らしそう
      視覚的なドキュメント化がずっと簡単になりそう
  • 本当に素晴らしい。メソッドや宣言へ移動するとき、ファイル全体を定義位置までスクロールした補助タブとして開くのではなく、関連するコード片だけを見せてくれる点が気に入った
    メソッドが呼び出される場所と定義を比較する必要があり、読んでいたメソッドをよく見失うのだが、それがかなりもどかしい
    メソッドを横に「固定」しておき、固定されたビューでうっかりファイル全体をスクロールしてしまうことなく眺められるのが良い
    少し使ってみたところ、残念ながらマウス中心の傾向が強く、別のメソッド内のメソッドをたどっていくと、管理すべき浮動ウィンドウが多くなりすぎた
    どのウィンドウが「親」ウィンドウなのか追跡できるように矢印や線があれば、一種のフローチャートを作りやすそう
    個人的に惜しい点はあるが、この領域で別の考え方を見られるのはうれしいし、成功してほしい

    • なぜ気に入るのかは分かるが、長期的には純効果がマイナスになる可能性もあると思う
      コードの何がどこにあるのかをある程度把握していることは有益だと思う
      何年も1つのプロジェクトをやっているのに、小さな断片だけを見て作業するせいで、各ファイルがいったい何をしているのか分からない状態になることもあり得るのではないか
    • 文芸的プログラミングは、これを1次元、つまり縦スクロール方式で実現し、2種類のビューを提供する
      コメントとテキストが混在した元のコード、そして整形済みテキストとナビゲーション用ハイパーリンクを含む見やすく組版されたコードがある
      http://literateprogramming.com/
    • その通りで、キーボードでもっと簡単に移動できるようにする作業が必要
      「親ウィンドウ」の基準点として何を想像しているのか気になる
      特定のウィンドウをアンカーとして指定したいのか、それとも何らかのヒューリスティックがそうしたアンカーを見つけてくれることを望んでいるのか知りたい
  • リリースおめでとう。最近は完全に逆方向に進んでいて、集中力や ADHD 傾向のせいであちこち飛び回って圧倒されるのを減らすのに役立っている
    ウィンドウ1つ、すべてを最小化、そして最も重要なのはツリー探索をなくすこと
    ファイルに移動する必要がある場合は、Intellij の最近使った項目メニューを使うか、ファイルマーカーへジャンプする
    つまり、ファイルマーカーを覚えていて、そこへ行く意図がある必要があるということ。vim ショートカット用に IdeaVim プラグインを使っている
    自分にとっては、この方式のほうがプログラミングをはるかに集中できて楽しいものにしてくれる
    マルチスクリーンからワイドスクリーンへ移り、そこから再び単一画面へ戻った変化の一部
    言及されているような大規模で成熟したコードベースでは、LLM を道案内に使っている

    • どう使っているのですか? 大規模で成熟したコードベースをどの程度と見ているのかも気になる
      私の経験では、LLM はファイル1つだけを相手にしても、かなり多くのミスや仮定をする
    • 分かる。LLM をどう道案内に使っているのか気になる
      私の経験では、LLM に機能の流れがどこにあるか聞くと、入口はうまく作ってくれるが、細部はしばしば自分で把握する必要があり、時には関連はあるが探していたものとは違う場所を指すことがある
  • 興味深い。いくつかメモがある
    Obsidian には「Canvas」という似た機能があるので、そのワークフローは参考になりそう
    自分にとってはスタンドアロンツールとしては役に立たず、Idea プラグインとして必要
    レイアウトを作る部分が一番嫌い。Git パッチやバグ修正を受け取って、それに合ったレイアウトを作ってくれる AI があるとよい
    レイアウト共有は非常に簡単であるべき
    Git 履歴をもう1つの次元として統合できるとよい。エディタ内に diff と blame 表示まで入るとよい
    AI 学習に使えるデータ、つまり Git コミットがある
    デバッグももう1つの次元として統合し、プロファイラデータも統合できるとよい

    • デモ動画を見ると、スタンドアロンではなく VSCode 内で実行されているように見える
      そこで提供されるものはそのまま得られるということ
      Idea 系のツールを使っているなら、現時点では方法がなさそう
    • ツールは良さそうで、仕事用に試してみたい。Android/Kotlin なので、IDEA 統合にさらに一票
  • こういうものをずっと前から試してみたいと思っていました。アップデートを受け取る方法はありますか?
    特に、最初に試す段階だけでも AI機能をオフにするオプションを待っています
    関数の中へズームインして、ファイルの残りを隠せる機能が特に良いです。こういうものが欲しいと思った瞬間が意外と多くありました
    1つのファイル内で、いま作業している関数を簡単に横にドラッグして並べ、単一ファイルを仮想的に再配置するような使い方もできそうです
    編集インターフェース以外にも、エディタの中には可視化の機会が多いと思います
    自分のコードとサードパーティ依存関係の相互作用、自分のコードの依存関係/呼び出しグラフまたはその一部、クラスやモジュールレベルの依存グラフ、オブジェクト内部の呼び出しグラフへドリルダウンするようなネストした呼び出しグラフなどが考えられます
    これらのケースではいずれも、可視化と編集の間をシームレスに行き来できることが、このツールが目指しているように見えるキラー機能です
    エディタにグラフィックが入るだけでも、コード変更頻度のヒートマップ、コード性能のヒートマップ、変数使用の追跡など、さらに多くの興味深い可視化が可能になります
    https://adamtornhill.com/articles/crimescene/codeascrimescen...
    最後に、The Programmer's Brain を読んでいないなら、このポッドキャストだけでも聴いてみるとよいです
    https://se-radio.net/2021/06/episode-462-felienne-on-the-pro...
    私たちの脳の働き方に関係する編集アイデアはたくさんありますが、エディタで十分にサポートされているのはまだ見たことがありません
    すでにその方向へ一歩踏み出しているので、さらに多くの機会があるかもしれません

    • 残念ながら、アップデート登録のための気の利いた方法はまだ作っていません
      最善の方法を考えてみますし、最終的には製品内で直接アップデートをプッシュする予定です
      いままさに copilotのオプトアウトを追加しているところです
      ここにあるアイデアは良いものばかりで、いくつかは一緒に議論したいです。よければメール/DMを送ります
      全体としていろいろな人と話したいですし、feedback@haystackeditor.com でフィードバックを受け取れます
  • 関数から関数へ、ファイルからファイルへ、そしてまた戻ってくる探索方法が本当に気に入っています
    もっと便利にするには、ブラウザの履歴のようなナビゲーション履歴ウィンドウがあるとよさそうです
    ファイルと関数の間を移動するときに一覧を表示し、開いているウィンドウを苦労して探し回らなくても、前後へ移動したり、履歴内の任意の位置へ直接ジャンプしたりできるとよいです
    ここで言っているナビゲーション履歴は、編集履歴とは完全に別物です
    編集の取り消し/やり直しがナビゲーション履歴を前後に動かしてはいけませんし、その逆も同じです
    もちろん、ナビゲーション履歴を行き来するキーボードショートカットはあってよいです

    • 良いアイデアです。最もうまく実装する方法を考えてみます
  • 素晴らしいです。Code Bubblesと関連があります: https://dl.acm.org/doi/abs/10.1145/1753326.1753706

    • その通りです。Bubblesは素晴らしいです。特にミニマップの概念が気に入っています
  • 「コードを保存したりログに残したりはしません。探索用copilotの入力としてコード片をOpen AIに送ります。近いうちにこれを無効化するオプションを追加します。」
    そのオプションが入ったら確認してみたいです

    • Macで探索用copilotのオプトアウトを追加しました
      コマンドパレット(CMD+SHIFT+P)を開き、“Opt out of navigational copilot” コマンドを使えばよいです
      Windows/Linuxも近日対応予定です
      存在しない関数を呼び出しているという診断がある場合にのみ、Open AIへデータを送る点も覚えておいてください
    • 同じ反応でした。こうしたツールの開発を支援する気はありますが、もう少し直接的な方法のほうがよいです
    • 同意します。最初からオプトインであるべきでした
    • 現状では会社で試すのは難しそうです
  • キャンバスベースのエディタ(Code Bubbles)、従来型のタブベースのエディタ(Eclipse)、そして私が設計したカルーセルベースのエディタ(Patchworks)の探索時間の比較に関する論文を出しました
    キャンバスは自由度が高すぎるという結果でした
    https://austinhenley.com/pubs/Henley2014CHI_Patchworks.pdf

    • 興味深いです。IDEの空間的配置について深く考えたことはあまりありませんでした
      振り返ると、VS Codeでももうタブは使っていません。開いているファイルが多すぎるからです
      ただ一度に1つのファイルだけを見て、切り替える必要があるときはCmd-Pで検索するか、最近使ったファイルの間を移動しています
      うまく機能していますが、ファイル/ディレクトリ名を常に頭の中に入れておく必要があります
    • 論文を少し読んだだけですが、Eclipseに関する議論を見ると、参加者が複数タブのエディタのように使うのではなく、IDEらしく使っていれば、ずっと効率的だったように思います
      メソッドを探す作業は、アルファベット順のアウトラインビューがあれば、はるかに問題にならなかったはずです
    • 本当に興味深いです。グリッドとキャンバスで迷いましたが、実際には探索がより簡単だと思ってキャンバスを選びました
      よければ話してみたいので、メールします
    • 興味深いです。Patchworksは、私がDoom Emacsを設定している方法にある程度似ています
      複数のワークスペースにまたがってコードパネルを4〜6個置き、SPC TAB 数字で切り替えています
    • 素晴らしい分析です。私にとってはキャンバスベースでもカルーセルベースでも、非常に大きなコードベースを扱うときに、常にかなりの量の認知データを頭の中に載せておかなければならない負担を軽減してくれます
      ツールをきちんと使うには、十分なワイドスクリーンも事実上必要です
      要点は、ファイルを縦方向ではなく横方向に扱うことに慣れることです
      この縦方向の思考は、初めてHello Worldを書いたときのやり方にかなり深く根差しています
  • リリースおめでとうございます。素晴らしく、よく実装されたツールに見えますし、試してみるのが楽しみです。
    以前から欲しいと思っていて、何度か手作業で作ってみたこともあるものの、共有できる形にはできなかった機能を思い出しました。コードの経路を1つのスクリプトやソースファイルに展開する機能です。
    ブレークポイントのようなものを設定して「unravel」ボタンを押すと、その地点までに起こるすべての動作を示す単一のファイルが残るといいなと思います。
    理想的には、そのファイルが単一のスクリプトとして実行できればなお良いです。
    本質的にはステップ実行デバッガが提供するビューと同じですが、複数のファイルや複数の階層を参照するのではなく、最初から最後まで1つのファイル内ですべて見たいのです。

    • なぜそれが必要なのですか?どんな問題を解決しようとしているのですか?望んでいる結果は何ですか?
      人々が要件、パラメータ、結果ではなく具体的な実装の詳細に注目すると、多くのことが伝達の過程で失われると思います。
      なぜこの実装を望んでいるのか、どんな機能や目的を果たすべきなのかが気になります。