ライブラリの効率的な勉強法

はじめに

プログラミングの勉強法というのはたくさん見かけるが、ライブラリの勉強法はあまり見かけない。ライブラリとは、先人たちが積み上げてきた便利機能のソースコードを、再利用性を高めてひとまとめにしたものである。

効率の良くない方法でライブラリを勉強している人を見かけることがあるので、本記事ではライブラリの効率的な勉強法について、個人的見解を述べることにする。

ただし前提として、本記事が念頭に置いているのは、デフォルトで付いてくる標準ライブラリのような巨大なものではなく、何かしら特定の分野、特定の用途で用いられるオープンソースライブラリである。

悪い例

ライブラリの勉強に挫折してしまう人はたいてい、以下のような学び方をしている。

  • クラスの実装を1行1行読んでいき、どこで何をやっているか考えて読む
  • ライブラリ全体の構成がわかっていないまま、コードを詳しく読んでいく
  • ライブラリの使い方がわかっていないまま、コードを詳しく読んでいく
  • 少しでもわからないことがあったら全て調べる
  • ライブラリ全体を隅々まで理解しようとする

全体感を把握する前から細かい内容を見ていくと、自分が今どこにいるのかがわからず、必ず迷子になる。迷子になると、学習がどれくらい進んだか、目的達成まであとどれくらいあるのか、がわからないため、学習のモチベーション継続が困難になってくる。

初めはわからないことだらけ、なわけだが、全てをわかろうとすると、わからないことに直面する度に心理的ダメージを負う。それが積み重なっていくと、コードを読むのが嫌になり、学習自体をやめてしまう。したがって、「わからないことがあって当然」というマインドセットで学習を進めることが大事である。

これらはいずれも、ライブラリ学習に限った話ではなく、プログラミング学習や、習得にある程度時間のかかる分野であれば、学習全般に言えることでもある。

学習の順序

勉強していく順番が重要である。全体から詳細へ、ざっくりした理解から細かい理解へ、という順番で学んでいくのがよい。
具体的には、学習する順番は以下の通り。

  1. サンプルコード
  2. テストコード
  3. フォルダ構成
  4. サンプルコードの切り貼りで何か動くものを作る
  5. クラスのインターフェース
  6. クラスの実装

それぞれについて、以下で順番に説明する。

1.サンプルコード

まず第一段階は、サンプルコードを動かして、そのライブラリで何ができるのかを確認する。何ができるのかがわかれば、自分のやりたいことから逆算して、どこから学べばよいかがわかる。そもそも何ができるのかがわかっていないと、学習のモチベーションが続かないだろう。

それに加えて、ライブラリの各クラスや関数(メソッド)が、どういう使われ方をするのか、を初めにぼんやりとでも頭に入れておくことが重要だ。そうすることによって、クラスの定義を読みに行った際に、「このクラス(やメソッド)はあのサンプルコードのあの辺りで使われていたな」といった気付きが出てくる。これによって、問題意識を持ちながらコードを読んでいくことができる。

2.テストコード

ライブラリによってはテストコードも付いてくる。その場合、自分が興味のあるものだけでも実際に動かしておきたい。

テストコードはそれ単体でインプットからアウトプットまで完結しているものが多いだろうから、サンプルコードと同様に、ライブラリのクラスやメソッドがどのような使われ方をするのか、押さえることができる。

サンプルコードよりもテストコードの方が、ライブラリの細かい部分まで追って行くことになるため、
・サンプルコードを動かした後、
・テストコードをいくつか動かしてみる、
という順番が良いだろう。

3.フォルダ構成

ここまでが終わったら、いざコードを読んでいく。
初めにやるべきは全体像を把握することである。ライブラリ全体の中でどこにどんな部品があるのかを確認したい。

そのために手っ取り早いのは、フォルダ構成を把握することだ。フォルダ分けを見るだけで、ライブラリにどのような機能が備わっているのかがわかるし、さらに各フォルダの下の階層がどういう構造になっているかを見ておけば、どの機能が充実していてどの機能はコードが少ないのかもわかる。

これでライブラリ全体がどのような構成で作られているかがわかる。

4.何か動くものを作る

全体像が把握できたところで、サンプルコードとテストコードを切り貼りして、何か動くものを作る。

ここでたいてい、他人のコードを切り貼りしただけでは足りない部品が出てくるので、手順1.から手順3.で読んだ内容を思い出しながら調べる。コードの全体像が何となくでも頭に入っていて、どのテストコードにどういう内容が書かれていたか何となく覚えていれば、自分にとって必要な部品がどのあたりにあるか、調べることができるだろう。

5.クラスのインターフェース

手順4.の中で、クラスのインターフェースや実装を見ないといけない場面も出てくる。それを一通り経験してからであれば、自分がまだ使っていない機能に関するクラスの学習も進められるだろう。

順番としては実装の詳細を見る前に、クラスのインターフェースを把握したい。ここでインターフェースとは、以下のことを指している。
・どのクラスを継承しているのか
・コンストラクタにどのようなインプットを与えているのか
・クラスのメソッド(関数)にはどのようなものがあるのか
・クラスのメンバー変数にはどのようなものがあるのか


ここまで読んでから実装を見ていくと、コードの意味が頭に入ってきやすい。

6.クラスの実装

ここまで来てやっと、クラスの実装を細かく見ていくことになる。
初めからこれをやろうとする人もいるが、あまりおすすめしない。実装の詳細は必要になってから読めばよいと思われる。

手順5.クラスのインターフェースと、手順6.クラスの実装、については、サンプルコードで使われているものから順番に見ていくのが良いだろう。実際に使われている場面を見ることで、そのクラスが何のために存在しているのかがわかる。使われ方を見てからその中身を見た方が、内容を理解しやすい。

おわりに

ライブラリ学習に限った話ではないが、以下のようなスタンスで学習すると挫折しやすい。

・全体像を把握しないまま詳細を細かく読んでいく
・わからないことを全て解消してからでないと前に進もうとしない

初めて出くわした内容が、一度ですっと頭に入っていくことはまれである。初めて知ったわけだから、繰り返し読んだり使ったりしていく中で少しずつ理解が進むことの方が多い。わからないことがあって当然、というスタンスで繰り返し使ってみるのが良いだろう。