
2026/04/26 1:11
これまで完了することのなかったプロジェクトを、コーディング支援ツールを使って再開させる行為。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
元のサマリーは質が高く、明確で、不必要な冗長性を排除しつつテキストの核心を捉えていますが、主要項目に記載されている特定の AI モデル(Claude Code/Opus)を明示的に記載することで、および使用された核心的なコーディング規約(例:Pydantic V2 の注釈、Google スタイルの docstring など)を簡潔に列挙することで、記述のプロセスの厳密さを強調し、その精度をさらに高めることができます。
これらの軽微な改善を盛り込みながら、流れを維持した上で若干洗練させたバージョンを示します。
精査後のサマリー
著者は「Sub-standard」という個人用音楽プロジェクトを約一夜間で機能させることに成功しました。このプロセスでは、Claude Code (Opus 4.6) を活用して複雑なコーディングタスクを処理させました。この実験は、明確な規約(Pydantic V2 の注釈や Google スタイルの docstring など)とコンテキストを与えることで、AI アシスタントが「Tsundoku」現象(時間的あるいは能力的な制約により停滞するプロジェクト)を超えて個別のコーディング目標を完了させることが可能であることを示しています。このワークフローでは、ストリーミングに
yt-dlp、検索に ytmusicapi といった特定のライブラリを利用し、約 80 の OpenSubsonic エンドポイントを扱うために SQLite ストレージを統合しました。初期の構築では、構造化データを正しく返すようにstubbed エンドポイントを見直す必要がありましたが、最終的な結果はプロフェッショナルなリリースよりも個人の願望実現を最優先し、意図的に認証をスキップしました。このアプローチは、開発者が AI に過剰に依存することで「deskilling」という潜在的なリスクを浮き彫りにしますが、クリエイターにとって強力なアクセラレータとなります。完全なリポジトリは git 上で入手可能であり、本来なら未完了のままになる可能性のある個人用プロジェクトの迅速実行のための青写真を提供しています。本文
備考:
この文章は、私が「Claude Code の性能が低下している」という前の投稿を執筆する前に初稿を作成したものです。将来のオープンコードに関する投稿で参照するために公開することにしています。ご覧いただけるように、私がこの文章を執筆してから現在に至るまでに、Claude Code に対する私の見解は大きく変化しております。
かつて私は個人的なプロジェクトを手始めに計画しましたが、生活が忙しくなるにつれ完成させることなく挫折しておりました [1]。まるで「ツンドク」という言葉のように、いつか読む予定の本の山を積み上げておきながら手に取らないままにしてしまう状況です。私たちにそうした未完了のプロジェクトは他にもあり、それらは AI によるコーディング支援ツールを試すのに最適な対象となります。そもそもあれらは何としても完成させられるはずのないものだったからです。
私が構築したコンセプト検証(POC)では、YouTube Music と OpenSubsonic API の間にアダプタ層(shim)を挿入する仕組みを取りました。OpenSubsonic について詳しく説明するには別の記事が必要かもしれませんし、その必要はありませんが、本稿の目的からすれば音楽ストリーミングクライアントとサーバー間の結合を適切に緩めるための API 仕様書として理解いただければ十分です。どちらの選択肢を選んでも構いませんが、私の場合ではサーバーには Navidrome を、デスクトップ版には Feishin を、Android では「GrapheneOS」という記事で触れた Symfonium を採用しております。
長々とはなりますが、このアダプタ層によって YouTube Music が OpenSubsonic API 準拠となるよう整形することで、私が使用するどのクライアントも取り込むことができました。裏側ではメタデータの照会には
ytmusicapi を、音楽のストリーミングにはプログラム的に yt-dlp を呼び出す手法を採用しました。基本的なストリーミング機能の実装は比較的簡単だったものの、すべてのエンドポイントを準拠した形で実装するまでには長い道程がありました。そしていつものように、新しい魅力的なプロジェクトが視界に入り、私の注意力を逸らしてしまいました。例えば「埋め込み Rust 配置管理プロジェクト」というのを、いつか必ず終えるつもりだったのです。あるいは、そうなったかもしれません。
所幸ながら、そのストリーミングプロジェクト自体は特筆すべき新規性はなく、実装するための明確な仕様が存在し、これが AI 支援コーディングに非常に適していたのです。ちょうど一ヶ月半前、私は Claude Code(バージョン Opus 4.6)を用いてこのプロジェクトをゼロから実装する試みを行った次第です。実際には無料で $50 分提供されるクレジットも与えられていたわけで、これを活用しない手はありませんでした。
環境設定
すでに私が手作業でコンセプト検証版を開発していたため、実装上の意見をお持ちの方にとっては事前に全般的な設計を明らかにすることが有利に働きます。このツールの動作範囲を適切に制限できるでしょう。
私は以下の手順を実行しました:
-
FastAPI、Pydantic、
およびytmusicapi
を依存関係として持つyt-dlp
プロジェクトを作成。uv -
ファイルを例示用の FastAPI メインファイルに書き換える。main.py -
OpenSubsonic の仕様書(spec)をフォルダー内に配置する。
-
README ファイルに簡潔な説明文を記述:
このプロジェクトは YouTube Music を OpenSubsonic クライアントとして公開するアダプタ層です。サーバーには FastAPI(Pydantic を用い)、メタデータには
、ストリーミングにはytmusicapi
を使用しています。yt-dlp
関連する OpenSubsonic ドキュメントは以下でご参照ください:https://example.docsy.dev/docs/reference/
OpenAPI スペックファイルは
に格納されています。openapi.json -
空の TODO ファイルを追加。
-
コマンドを使って/init
ファイルを生成する。CLAUDE.md
また、私は
CLAUDE.md ファイルに以下のような節を頻繁に追加します:
慣習
- 各メソッドには引数と戻り値に対する型注釈およびドクストリング(docstring)を含むこと。
- データモデル化には Pydantic を採用し、現代的な Pydantic V2 の慣習に従うこと。
- ドクストリングは Google スタイルフォーマットを使用し、
とargs
節を明記すること。returns - ユニットテストは最新の pytest スタイルで記述し、トップレベルのメソッドには
ステートメントとフィックスチャ(fixtures)を活用すること。assert
これは主に過去の実践経験に基づくものであり、私が Claude Code に繰り返し要求するべきではないことに基づいています。この出発点を git リポジトリとしてまとめているのも、他の方が同様の実験を試みられることを願っています。
MVP の実装
環境設定が整い次第、Claude に開発作業を任せることにいたしました。普段私が用いるワークフローは以下の通りです:
- プランモードへ移行する。
- 次の作業内容を確認する。
- 初期プランを受け取った後、ギャップや問題点を洗い出し、フォローアップ質問を行ってプランを満足のいくものに修正するまで繰り返す。
- Claude がオフライン状態の際に、関連リソースのリンクを提供する。
- 複数の選択肢があり、どの方を選べばよいか不明瞭な場合、Claude に検索ツールを利用させて最適な選択を導き出すように依頼する。
- 「文脈を受け入れ、クリア」を行う。
- これらのステップを繰り返す。
最初に用いたプロンプトは以下の通りです:
ファイルを確認してください。これは OpenSubsonic API の仕様書です。全てのメソッドに対してスタブ(占め)実装を持つ非同期 FastAPI サーバーを作成してください。古い XML エンドポイントと新しい JSON スタイルのエンドポイントの両方が存在しますが、今回は新規の JSON エンドポイントのみ処理すれば十分です。openapi.json
このような変更においては、実装後に文脈をクリアし、フォローアップ質問を行うことを好みます:
に規定された全てのメソッドについてスタブ実装を行いました。正しいか再度確認していただけますでしょうか?openapi.json
仕様書があっても Claude Code は最初の試行ではミスを犯することがありますが、その後でほとんど自動的にそれらを修正してくれます。さらに、大規模な変更を実装した後は
/init を再実行し、新しい変更事項も CLAUDE.md ファイルに反映させるのが望ましいでしょう。
次に重要なプロンプトは以下の通りです:
すべてのエンドポイントのメソッドが既にスタブ化されています。Subsonic クライアントから検索を行い、楽曲を探してそのクライアントにストリーミングするための最小限の機能は何ですか?
を YouTube Music の検索に、ytmusicapiをストリーミング用に使用してください。yt-dlp
比較的短期間で合理的な実装案が得られたものの、Feishin と実際に接続しようとした時点で破綻してしまいました。その段階では、クライアントでテストを繰り返しながらサーバーのログを手渡すことで改善を続けました。仕様書がある場合でも、エンドポイントに
.view という接頭辞が追加されているといった細部の処理は明確に記されていません。常にエラーが発生するたびに新たなユニットテストを作成し、対応を強化しました。
Feishin を介した音声ストリーミングが可能になるのには僅か数回の実験で驚きました。主な問題はスタブ実装のエンドポイントが何も返さない点でした。これらを空だが正しく構造化されたレスポンスを返すように修正する必要がありました。MVP を構築する側は比較的容易でしたが、私がかつて POC で実装したものとはあまり変わりませんでした。
細部の実装へ進む
残りの作業は、プロジェクトを実際に使いやすくするための、それほど興味深くないが地道な部分でした。ドキュメントによれば、OpenSubsonic は大別して 15 のカテゴリにわたって約 80 つのエンドポイントを持っています。
MVP の目的のためには以下の機能のみをサポートすれば sufficed:
、getLicense
、getUser
、getGenres
:空だが有効なコレクションを返す。getMusicDirectories
:クエリパラメータに指定された ID をデフォルト値として返すパススルー処理。getSong
:極めてシンプルなsearch3
の呼び出し。ytmusicapi
:stream
をyt-dlp
でラップし、"bestaudio" フォーマットの URL を抽出する実装。asyncio.to_thread
:getCoverArt
を呼び出してカバー画像の URL を抽出する処理。yt-dlp
Subsonic クライアントの全機能に対応するためにはさらに以下を追加しました:
の呼び出しに対し、使用制限に達することを避けるため単純なメモリー内キャッシュを実装。ytmusicapi- 音楽メタデータの保存には SQLite を用い、閲覧カテゴリのすべてのエンドポイントを実装。特に
もトップソング一覧をクエリする形で対応。getTopSongs - ストリーミング中に楽曲をディスクに保存し、再ダウンロードを防ぐ仕組みを追加。ただし、ストリーミングエンドポイントからクライアントが切断した場合(ファイルダウンロード完了前)に破損したファイルをクリーンアップするための追加処理が必要でした。
これら全てを行うべきは、私の POC をより使いやすくするためであることを自覚しており、やろうと思っていたにも関わらず実行することはなかったのが現状です。同時に、私が何かを公開することを計画していないため、認証周りの難易度の高い部分は完全に省略しました。その結果、短い evening の間に Subsonic クライアントから接続可能な動作するサービスを作成することができました。最終的に私はこのプロジェクトに「Sub-standard」という名付けを行いました。
これは良いことなのでしょうか?
AI コーディング支援ツールの促進者として見なされたくはありません。これらのツールを過剰に頼ることによるスキル低下に対する懸念はまだ残っています。そのため、Rust を学びたいとの願望を実現しようと、しばしば頭を壁に打ち付けながら努力し続けています。
私の考えの中では、個人的プロジェクトにはいくつかのバケツに分けることができます。一つは「学び・成長のためのもの」、もう一つは「本当は存在してほしい」と思っているものです [2]。今回のプロジェクトは後者のカテゴリーに含まれます。AI コーディング支援を活用することで、それらの願望実現を具現化する一種の手段と言えます。かつてなら到達し得なかった場所でしたが、今では実際にプロジェクトを持てています。書棚に unread として並んでいた比喩的な本の一つがなくなります。
最終的に重要なのは、どちらのバケツに属するプロジェクトに取り組んでいるかどうかではなく、 Bucket 2 のプロジェクトに加えて、Bucket 1 に属する「張り切り課題」も同時に進め続けているかどうかです。
あるいは、そう言い訳するのは私の個人的な口実でしょう↩︎
他にも様々なバケツが存在することにも触れず、これだけが唯一の分類であることを示唆したわけではありません↩︎