エンジニアの学び方─効率的に知識を得て,成果に結び付ける

第2章 最初の一歩をどう踏み出すか―必要なところを学ぶ,全体像をつかむ,写経する

この記事を読むのに必要な時間:およそ 1 分

本章では「勉強したいと思っているが『やる気』が出ない」という状態を解決し,一歩踏み出す方法について解説します。

やる気が出ない場合,⁠勉強」を漠然とした大きなタスクとしてとらえていて,その大きさに圧倒されていることがよくあります。ゴールの見えないマラソンでは,走り続ける「やる気」を出すのは難しいことです。もっと近いゴールを設定し,そこまで走ることを目標にすることが必要です。つまり「勉強」をもっと細かいタスクに分割することが必要です。

勉強を分割する方法は次の3つです。

  • 必要なところから学ぶ
  • 大まかに全体像をつかむ
  • 片っ端から写経する

上のものほど効率が良いのですが,より多くの前提知識を必要とします。

必要なところから学ぶ

たとえば,プログラミング言語を学ぼうとしているとしましょう。その言語を使って作りたいものが決まっているなら,それに必要なところから学ぶと効率が良いです。この方法は「遅延評価的勉強法」とも呼ばれます注1)⁠遅延評価とは「式の値を,その値が必要になるまで計算しない」という意味の言葉です。YAGNIYou ain't gonna need it.という言葉もあります。これは,⁠機能は実際に必要となるまでは追加しないのがよい」という意味の言葉です。

これは本を読むときなら,⁠必要なところを開いてそこだけ読む」に相当します。不真面目なように思うかもしれません。しかし,学ぶことが目的なのか,学ぶことは別の目的を達成するための手段なのかは区別したほうがよいでしょう。手段として学ぶ場合に,必要ないことまで学ぶのは不必要なコストを支払っていることになり,経済的に合理的ではありません。

注1)
遅延評価的勉強法という言葉は2008年に天野仁史さんが発明しました

前提条件

必要なところから学ぶためには,前提条件があります。

目標が明確化されている

まず,目標の明確化が必要です。目標は「達成したかどうか」を判断できることが必要です。つまり「勉強する」は適切ではありません。⁠勉強する」という目標は,いくら努力しても達成できず,心が折れます。そうではなく,たとえば「Rubyの処理系をソースコードからビルドする」などがよいでしょう。これは達成したかどうかが判断できます。

目標が実現可能である

次に,目標はあなたにとって「たどり着けそう」であることが必要です。他人が何を目標にしているかではなく,あなたがあなた自身に適切な目標を決める必要があります。筆者の友人は「新しい言語を勉強するときには,その言語でレイトレーシング注2を実装する」と言っていました。彼はレイトレーシングの実装に慣れていて,目標として適当なのでしょう。一方,筆者はレイトレーシングの実装に慣れていないので,新しい言語を学ぶための目標としては不適切です注3)⁠

大まかに全体像を把握している

目的が明確で,目標がたどり着けそうでも,まだ十分ではありません。必要な情報を見つけるためにどこを探せばよいのか,大まかに全体像を把握できていることが必要です。⁠きっとあのあたりにドキュメントがあるだろう」「あのあたり」を思い付くことができないのであれば,あなたは先に次の節「大まかに全体像をつかむ」を行うほうがよいでしょう注4)⁠

注2)
3次元の形状を2次元の画像にするコンピュータグラフィックスの手法の一つです。
注3)
筆者が以前レイトレーシングを実装した際には,まず筆者の慣れている言語(Python)で速度を度外視して実装して,理解のとおりに振る舞うことを確認し,それからC++に移植しました。
注4)
「知っている」「知らない」の間には「必要になったときに調べられる」があります。⁠調べる」にかかる時間は短ければ,多くのものを知っているように振る舞うことができます。

学びの理想的な状態

これは学びの軸の「広い知識」⁠深い理解」⁠応用対象」の全部にある程度の知識があり,学びの3つのフェーズ「情報収集」⁠抽象化」⁠応用」のサイクルがぐるぐる回っている状況です。どこに情報があるか大まかな位置がわかり,見つけた情報をすぐ応用し,動かしてみてその結果を見て,ほかに何が必要かがわかるわけです。

この学びができている状態が理想です。しかし,これは対象に十分詳しいからこそできることです。新しい分野にチャレンジしたときには使えません。なので最初からこの学び方ができないとしても悲観することはありません。

大まかに全体像をつかむ

もし必要な情報を見つけることができていないのなら,まず全体像を把握することが必要です。

たとえばソースコードを読むことを考えてみましょう。どうやって読めばよいでしょうか? 本を読むように頭から順番に? いいえ,違います。

まずは大まかに,徐々に詳細に

『Rubyソースコード完全解説』という本のソースコードの読み方の解説がとても簡潔にまとまっています注5)⁠ぜひ一読をお勧めします。ここでは,その中から「静的な解析」の節を簡単に解説します注6)⁠

ソースコードをどう読むのか? まず「構造を解説したドキュメント」を読みます。次に「ディレクトリ構造」を読みます。そして「ファイル構成」を読み,略語を調査し,と徐々に細かい単位にします。いきなり関数の中身を読みはじめたりせず,まずは大まかに全体像を見るところから始めるわけです。

書籍を読むときでも同じです。多くの速読の教科書では目次や章タイトルに注目することを勧めています。まずは大まかに,徐々に詳細に,というわけです。

注5)
青木峰郎著/まつもとゆきひろ監修『Ruby ソースコード完全解説』インプレス,2002年,序章の「ソースコードを読む技術」⁠書籍の全章がWebページでも公開されています。
注6)
その手前に「目的の具体化」とソースコードならではの「動的な解析」があります。目的の具体化は,本章の前節の内容と同じですね。⁠動的な解析」はソースコードならではの読み方です。ソースコードを実行して,その振る舞いを観察することで知識を得るわけです。

ドキュメントの大まかな構造

実話を例に挙げます。先日「Pythonのglobalはファイル単位のスコープだ」という話を某所でしたところ,Xさんに『Python言語リファレンス』のglobal文の説明にはそんなこと書いていないけど,どこに書いてあるの?」と質問されました。これを聞いた筆者が最初に思ったことは,⁠チュートリアルに書いてあったはず。あと言語リファレンス見るにしてもそこは文法定義の章だから違う。もっと手前に実行モデルの章があったはずだ」でした。

そして数回Googleで検索して,『Pythonチュートリアル 9.2. Pythonのスコープと名前空間』に書かれています。あと言語リファレンスで言うなら『名前づけと束縛(naming and binding)⁠です」と答えました。

X氏はけっしてプログラマとして能力が劣るわけではありません。違いは,筆者にはPythonのドキュメントの大まかな構造がわかっていたという点です。

英語の論文の大まかな構造

別の実話をします。筆者は「この論文を読むといいよ」と英語の論文を渡されました。それは筆者の思い付きと似たことをやっている先行事例でした。これを読むと,⁠自分の思い付きはすでにやられていることだ」という残念な結論になるかもしれません。無意識にそう考えたのか,なかなか読む気が起きませんでした。

頑張って最初から読んでも全然頭に入りません。苦痛です。そこでまず論文を印刷し,25分間で章見出しとキーワードを赤ペンで囲う作業をしました。⁠論文を理解する」というあいまいな目標の代わりに,時間を区切って明確なゴールを作り,大まかな構造を頭に入れようとしたわけです。そうすると,この論文は議論の出発点は筆者とかなり近いが,途中で予想と違う方向へ話が進んでいる,ということがわかりました。この結果「なぜ予想と違う方向へ進んだのか?」の答えを見つけるという「明確な目標」ができ,それがどこに書いてありそうかも大まかに理解できました。あとは簡単でした。

原因は,⁠この目的にはAにすべきところをBにしている」でした。今になって考えると,まず概要を読んで「やろうとしていることは筆者とまったく同じだな」と思ったのに,次に結論を読んで「さっぱり意味がわからない」と思ったのは,筆者が当然Aだと思っている前提をその論文の著者がBにしているせいだったわけです。大まかに全体像をつかんだことで筆者の考えと論文著者の考えがずれはじめるポイントがわかるようになったわけです。

深い理解が必要

この学び方を行うには,⁠応用対象」軸の知識は必要ありません。しかし,⁠深い理解」軸の知識は必要です。たとえばRubyのソースコードのファイル名を見てみましょう。compile.cというファイル名を見ても,コンパイルという概念を知らなければ何も読み取れません。知っていれば「ああ,ここがコンパイルをするんだな」とわかります。もっと理解が深ければ「ああ,ここがきっと抽象構文木を受け取ってVMのバイトコードを生成するんだろう」とわかるわけです。

著者プロフィール

西尾泰和(にしおひろかず)

サイボウズ・ラボのエンジニア。個人やチームの生産性をどうすれば高めることができるかを研究し,未来のグループウェアの研究開発をしている。プログラミング言語の多様性と進化にも強い関心があり,2013年に出版した『コーディングを支える技術』はベストセラー,重版を経て,韓国語版が出版された。

コメント

コメントの記入