🙆‍♀️

Serena使ってみたらとってもよかった話

に公開

本記事は『水道橋 BeerBash vol.1』 で発表した内容に追記・再構成を行ったものです。
https://speakerdeck.com/drumcansmith/serenagasubetezhi-tuteita

ある日…

バックエンドエンジニアとして業務を行っていた私は、ある日

  • ソケット通信・非同期処理・マルチスレッドを駆使した基盤に手を入れつつ
  • DeepStreamパイプラインに機能追加を行い
  • Jetson上で動作するGUIアプリにも新しいコンポーネントを組み込む

という盛りだくさんのタスクを任されました。楽しそうではあるものの、規模の大きいリポジトリの構造を把握するだけでも時間がかかりそうで、「やりたい!けれど足がかりが欲しい」「そもそも自分にできるのかな?」という不安がよぎりました。

そんなときにちょうどSerenaの話題を見つけました。「大規模プロジェクトのコードの構造や依存関係を把握してくれるMCP」ということで、今の状況にうってつけの打開策でした。そんな経緯で、Serenaを実際に業務で使用してみた所感を記事としてまとめていこうと思います。

Serenaとは?

Serenaは「Semantic Retrieval & Editing Noetic Agent」の略で、直訳すると「意味的な探索・編集を行う知性ある代理人」といった意味になります。「意味的な」という部分が抽象的ですが、「コードをただの文字列としてインプットするのでなく、コード全体の文脈・構造を理解できる」という解釈で大方合っていると思います。Serenaはオープンソースのツールキットで、LLM(大規模言語モデル)と組み合わせることで既存のコードベースに対する理解力と編集能力を大幅に高めることができるとされています。GitHubのREADMEでは、最初に

  • 🚀Serenaは、LLMを「コードベースを直接弄ってくれる、フル装備のエージェント」に変身させる強力なコーディングエージェントツールキットです。特定のLLM・インターフェース・フレームワークに縛られることがないため、柔軟かつ簡単に使用できます。
  • 🔧Serena は、IDE(統合開発環境)の機能に似た、本質的なコード検索および編集ツールを提供し、関数・クラスなどの定義も含めたコードの情報を整理し、「どれがどれを呼び/どれに呼ばれたか」などの関係性を利用しています。これにより、既存のコーディングエージェントと組み合わせることで、必要な部分をピンポイントで読み出し・編集することで(トークンの)効率を大幅に向上させます。
  • 🆓 フリーかつオープンソースであり、既存のLLMに対して追加費用なしで利用できます。

といった紹介がなされています(かなり要約しています)。

Serenaはエディタで使えるような定義へのジャンプやコード検索、コード挿入などの機能を備えており、Serenaなしだとファイル全体を読み込んでgrepで検索をしていたLLMが、Serenaの機能を用いることでより効率的に開発者に貢献してくれるエージェントとなる、といった具合です。

使って思ったSerenaの良いトコ

忘れない

コーディングエージェントとの会話でよく起こるのが、会話のラリーが続くとエージェントが最初らへんの内容を忘れ始めることだと思います。これは覚えていられるコンテキストに制限があるため起こることで、特に大規模プロジェクトだとコードの量も多く、頻繁に発生することでしょう。
Serenaは先ほども説明した通り、コード全体を文字として覚えず、関数や変数・クラスなどの定義同士の関係性を主として覚えています。そのため必然的に消費するコンテキストも少なくなり、「以前言ったよね?」とAIを詰める必要がなくなります。

理解力が高い

SerenaはLSP(Language Serve Protocol)というプロトコルを使用しています。

図のように、各言語を担当するサーバーがいて、LSPを介してフォーマットしたり、エラー検知したり、定義を確認したりするプロトコルのことで、VS Codeなどのエディタでも使用されています。
これを用いてコード全体の関係性を把握していることで、

  • 「これって何する変数?」などのコード理解に関する質問
  • 継承元を修正したため継承先も修正しないといけなくなったなど、単純な文字列置換では見逃してしまう修正

などを高水準で行ってくれるようになります。言語サーバーが後ろに必要な関係上、対応する言語も限られてはいますが、現時点で20言語ほど対応しているみたいなので基本的には使用可能だと思われます。

簡単

導入が非常に簡単でした。私はWindows11のWSL2+Claude CodeでSerenaを用いたのですが、以下の4行で終わりました。

# SerenaをMCPとしてclaudeに追加。WSL2だとGUIがなくdashboardが使えないため、--enable-web-dashboardはFalse
claude mcp add serena -- uvx --from git+https://github.com/oraios/serena serena start-mcp-server --enable-web-dashboard False --context ide-assistant --project $(pwd)

# プロジェクトのindex作成、私の環境だと1時間くらいかかった
UV_TOOL_PACKAGES= UV_EXTRA_PACKAGES= uvx -p 3.11 --isolated --from git+https://github.com/oraios/serena serena project index

# Claude Code 起動
claude

# Claude Code内:Serenaにざっと構造を理解してもらう
serena、オンボーディングして

体験談

(人によるとは思いますが)私の場合、何かを書く上で一番時間がかかるのが「最初の書き出し」です。
タスク分解まではできても、いざコードへ!となると、何から書いていけばいいんだろう…?となることがよくあります。今回、Serenaを使ってみて一番実感したのは最初の書き出しの早さとその完成度の高さです。機能の概要と要件を提示すると、Serenaはコードベースを横断して関連するシンボルやファイルを探し、土台となる関数やクラスを生成してくれます。大体6割くらいは完成しており、残りは手を加えるだけで済むことが多いので、一番悩んでしまう部分の大枠を作ってくれるのは非常にありがたかったです。また、出てくるコードも非常に「我々のチームらしい」コードが出てきて「そんなところまで見てるのか」と怖くなりました。
試しに、私がかつてやっていたAtCoderのファイルをまとめたプロジェクトでSerenaなし/ありを試してみたところ、なしの方が効率的なコードを書いてくれていて、ありの方は私のコード由来の愚直な実装をしていました。

また、謎の変数や処理に遭遇したときはチャットで「このfooBarってどこで定義されている?」「ここの非同期処理はどういう意図?」と質問すると、Serenaが依存関係を辿って答えを返してくれます。プロジェクト内のことは何でも知ってました。

まとめ

コードライティングだけでなく、リーディングもより一層効率的に実現できる非常に有用なツールであると感じました。特に定義の確認のような地味に時間のかかる作業が質問一つで済むのはありがたいです。
皆さんもSerenaを導入して、快適なコーディングライフを送ってみてください!

参考文献

https://github.com/oraios/serena
https://zenn.dev/roottool/scraps/231372ac6ed731
https://zenn.dev/contrea/articles/d18ee9447a9366

株式会社TechSword

Discussion