DUICUO

オープンソースプロジェクトを学ぶためのいくつかの提案

国内のオープンソースコミュニティとプロジェクトの継続的な発展に伴い、ますます多くの開発者がオープンソースプロジェクトを学習し、応用し、貢献しています。最近、複数のオープンソースプロジェクト(KVM/QEMU、libvirt、OpenStack、Ceph、Zabbixなど)を研究してきた業界専門家のZhang Yu氏が、自身のブログでオープンソースプロジェクトを学習するためのいくつかの提案を共有しました。一読の価値があります。

Zhang Yu 氏は、オープンソース プロジェクトの学習は次の 5 つのレベルに分けられると考えています。

1. プロジェクトの基本概念、用途、論理構造、基本原理、背景、および適用シナリオを理解する。このレベルは基本的に「ポピュラーサイエンス」です。プロジェクトの基礎的な理解のみが必要で、短期間で実際の技術作業を開始する必要がない場合は、現時点ではこのレベルで十分です。

2. プロジェクトの基本的なインストール手順と使用方法を習得します。このレベルは基本的に「入門」であり、プロジェクトの直感的な理解と、インストールと使用に関する実践的な経験を提供します。プロジェクトを現状のまま使用する必要がある場合は、このレベルで初期学習に十分です。

3. コード構成を理解し、主要なロジック/機能モジュールとコードファイルの対応関係を特定し、コード分析を通じていくつかの主要な代表的な実行フローを辿ります。このレベルの基本的な目標は「深く掘り下げる」ことであり、プロジェクトの実際の実装を理解し始めることです。プロジェクトの機能、動作原理、コード実装を真に結び付け、プロジェクトのワークフローを直感的に理解できるようになります。このレベルは、オープンソースプロジェクトのコード学習の真の始まりです。このプロジェクトをベースにアプリケーションを開発したり、関連性の高い他のプロジェクトに取り組んだりする場合、このレベルのプロジェクトコード理解は非常に役立ちます。

4. プロジェクト内のすべてのコードモジュールとプログラムファイルの機能を理解し、主要な実行フローをすべて操作できる。このレベルの基本的な目標は「習熟」であり、プロジェクトの設計と実装を包括的かつ体系的に理解し、プロジェクトの各部分のコードに精通することを意味します。プロジェクトを詳細にカスタマイズまたは変更したり、コミュニティに貢献したりしたい場合は、このレベルに到達することを目指す必要があります。

5. プロジェクトの様々な設計コンセプトとコード実装の詳細を徹底的に研究し、理解する。このレベルにおける基本的な目標は「熟達」、つまり卓越性を目指し、学びは無限であることを認識することです。これは専門家が追求する領域です。プロジェクトコミュニティへの重要な貢献者、あるいはコアコントリビューターを目指すなら、このレベルを目指すべきです。

オープンソースプロジェクトについて学ぶには、基礎知識を習得することが不可欠です。Zhang Yu氏は3つの重要なポイントを指摘しました。

  • このプロジェクトでは、必要な技術分野の背景知識が求められます。例えば、Linux Kenrelを分析するにはオペレーティングシステムの原理を理解する必要があり、OpenStackを学ぶにはクラウドコンピューティングとは何かを理解する必要があります。こうした基礎知識がなければ、ソースコードにいきなり飛び込んでも無駄な努力になってしまいます。
  • このプロジェクトの開発で使用される言語と、さまざまな開発およびデバッグ ツール。
  • 英語。残念ながら、これまで真に人気のあるオープンソースプロジェクトのほとんどは中国発ではありません。そのため、非常に人気があり、十分な資料が揃っている少数のプロジェクトを研究するだけでなく、参考資料として英語の資料を集めて読む必要があります。英語をしっかり学ぶことは非常に重要です。

学習目標と基礎知識が定まったら、次のステップは学習戦略とプロセスを構築することです。張宇は、表面から核心へと進み、徐々に理解を深めていく学習法をまとめました。

プロジェクトに初めて出会ったとき、目にするのは本質的にブラックボックスです。ドキュメントによると、このボックスには複数の外部インターフェースがあることがわかります。一般的に、これらのインターフェースは以下の3つのカテゴリーに分類できます。

1. 設定インターフェース:ボックスの動作モード、基本パラメータ、拡張プラグイン、その他の重要な機能を設定するために使用します。これらの設定は、ボックスの起動前に一度だけ行われることが多く、ボックスの動作中は変更されないか、ごくまれにしか変更されません。

2. 制御インターフェース:ボックスの動作中に重要な動作を操作するために使用されます。これは、ボックス管理者が制御コマンドを挿入し、ステータス情報を読み取るためのチャネルです。

3. データインターフェース:ボックスが動作中に外部データを読み取り、内部処理後に出力するために使用します。これは、ボックスのユーザーが最も関心を持つデータパスです。

したがって、オープンソースプロジェクトのコードを分析する際には、重要な構成、制御、およびデータインターフェースに重点を置く必要があります。特に、主要なインターフェースの基盤となる操作フローを理解することに重点を置く必要があります。例えば、データインターフェースに関しては、少なくとも1つの完全なデータ入出力フローを理解する必要があります。これは、入力インターフェースからコンテナへの入力、様々な処理および転送ステップを経て、出力インターフェースからの最終的な送信に至るまで、コード内の実行プロセス全体をトレースすることを意味します。このようなフローが理解できれば、データ処理に関連する様々な主要モジュールとステップを関連付けることができ、ロジックモジュール図やドキュメント内の抽象概念をコード実装にマッピングできるため、プロジェクトへの理解が深まります。

このアプローチを実践するにあたっては、制御インターフェースとデータインターフェースの両方から、1つまたは2つの主要なインターフェースの基盤となる実行フローを詳細に分析することを優先することをお勧めします。目標は、各ステップにおける関数呼び出しとデータ転送の関係を特定することです(システムまたはアプリケーションライブラリが提供する低レベル関数は、時間を節約するために最初は省略できます)。これが完了すると、第3レベルの学習目標が暫定的に達成されます。

設定インターフェースの重要性はプロジェクトによって異なります。OpenStackのCeilometerのように、アーキテクチャの柔軟性が高く、設定スペースが豊富なプロジェクトの場合は、より多くの時間をかけて学習できますが、そうでない場合は基本的な理解で十分です。

著者は「OpenStack Cinder」を例に挙げて、オープンソース プロジェクトから学ぶ方法を説明しています。

1. まず、Cinderを分析するには、いくつかの基本的な概念を理解する必要があります。クラウドコンピューティングとは何か?ブロックストレージとは何か?OpenStackとは何か?OpenStackにおけるCinderの役割とは何か?などなど。これらの概念を理解しなければ、それ以上の学習は非常に困難になります。

2. これを踏まえ、可能であれば、***Cinder(その他の必要なOpenStackコンポーネントを含む)を実際に導入・運用し、Cinderの直感的な理解と体験を積むことで、その後の分析の参考としてください。ここでは、CinderのバックエンドとしてCephを使用し、OpenStack上で動作する仮想マシンとしてKVMを使用していることを前提としています。

3. 次に、分析対象システムの論理フレームワークを概念的に理解する必要があります。一般的には、Horizo​​nとNovaの論理モジュール構造、それらの連携動作方法、そしてCinderとの関係を理解する必要があります。この部分は、Cinderの制御インターフェースと実行パスの分析と密接に関連しています。さらに、CinderとKVM/QEMU、Cephの相互関係を理解する必要があります。これは、Cinderを真に理解する上で非常に役立ちます。Cinderの観点から、内部の論理モジュール構成、それぞれの機能、相互制御、データ接続関係を理解する必要があります。

4. 上記の準備が完了したら、Cinder コードの解析を開始できます。前述の通り、解析対象として制御インターフェースとデータインターフェースの両方から、主要な代表的なインターフェースを1つまたは2つ選択することを検討してください。設定インターフェースについては、特定の設定を実装していると想定すれば十分であり、今のところあまり時間をかける必要はありません。Cinder の中核機能は、実際には OpenStack 上のボリューム管理です。少なくとも Cinder+Ceph ソリューションにおいては、Cinder 自体はデータ転送のクリティカルパス上にはありません。したがって、Cinder ソースコード解析においては、制御インターフェースの解析が最も重要です。初期段階では、ボリューム作成とアタッチという2つのインターフェースとそれに対応する実行フローが、Cinder 解析の出発点となります。これら2つの操作の実行フローを徹底的に理解すること(少なくとも librbd を介して Cinder と Ceph がどの程度相互作用するかを把握すること)は、Cinder の機能と実装を真に理解する上で非常に役立ちます。 KVM ベースの仮想マシンは、Cinder によって作成された Ceph 提供のボリュームにアクセスするときに QEMU 経由で Cinder にアクセスしません。つまり、ソース コードのこの部分は Cinder ソース コードの学習範囲を超えていますが、Cinder を本当に徹底的に理解したいのであれば、この部分についてある程度の知識を持っているか、少なくとも概念的に理解している必要があります。

さらに、著者は、メモをしっかり取る、細部にこだわりすぎないといったアドバイスも提供しています。全文はZhang Yuのブログでご覧いただけます。InfoQ読者の皆様は、オープンソースプロジェクトについて学んだ経験をぜひ共有してください。