プログラミング言語の学習は「これから使う内容だけ」から始めてみよう
「学習するプログラミング言語は決まったから、淡々とやっていこう。でも、量が多くて大変そう。上手く短縮できないかな?」
「プログラミング言語の学習範囲が広すぎて続かなさそう。継続できるコツはないの?」
この記事は新しいプログラミング言語を学びたい/学んでいる人向けの記事です。読み方によっては新しいことを学びたい人、現在学んでいる人、学習に興味がある人にも参考になるかもしれません。
プログラミング言語の学習に限った話ではないですが、学習を継続することが難しいと感じている人は多いのではないでしょうか?
世の中では、1日5分だけでも取り組むとか、成果をアウトプットする、同じ目標の人をSNSで見つけ、励まし合うなどの方法が推奨されていますね。
僕は「プログラミング言語の学習では、自分が必要としている内容について調べて、調べた内容だけに絞って学習すると効率がよさそう」と思っているので、学習の進め方について紹介します。
これはジョシュ・カウフマンの「たいていのことは20時間で習得できる」に書かれている内容なので、「それ知っているよ」という方はこれ以降を読んでも新しい発見が少ないと思います。
この記事には次のことを書きました。
目的に合わせて、プログラミング言語学習内容を絞った学習の進め方
何故、必要なところだけの学習でいいのか?
プログラミング言語を一通り学習するために必要な時間はたくさん必要です。他のプログラミング言語に精通している人でも、それなりの時間がかかります(と思ってます)。
一通り学習すると、今の自分が必要としていない内容も含まれているので、時間効率がよくありません。プログラミング言語の知識は深まっていますが、やり遂げたい事には不要なので、時間がもったいないです。
やり遂げたいことを達成できた後に、そのプログラミング言語についての興味が残っていれば、その時に改めて学習すればよいと思っています。興味や関心を持って学べば効率よく自分のスキルとして獲得できるはずですから。
「一通り、学習を済ませた後、目的達成に向けてプログラミングを始めても遅くないと思う」
「生半可な理解のまま、プログラミングを行うと、バグを大量に作り込んでしまったり、応答速度が悪いままだったりする可能性がある」
この様な意見を持っていませんか?ジョシュ・カウフマンの書籍を読むまでは僕もこんな考えを持っていたと思います。
今の仕事で使っているプログラミング言語はC/C++ですが、言語機能をフル活用していることは無く、一部の機能を多用しています。僕が担当している組み込みソフトウェア開発業務としてはこんな状況でも十分通用します。
新しく学習した内容を試そうと思っても、実践でうまく活用できず、アレコレと試したり、長く苦しんでようやく使い物になることが少なくありませんでした。座学として取り入れても、実践で活用できるかは別の問題だと感じています。自分の状況に合わせたサンプル例が載っていないことがほとんどですから。
そのため、必要な内容だけ学んで、実践経験を積む時間を確保することはとても意味があります。
また、バグの作り込みについてはテストを充実させて対応し、応答速度については具体的な目標値設定と実測で対処できます。これまでの開発を思い返すと、ある程度の規模のソフトウェアになるとバグが無いということはありませんでした。必ず、何らかのバグが作り込まれているので、バグは絶対に潜んでいると思って望む方がよいでしょう。
ここまでをおさらいすると、
プログラミング言語を学習する時間コストは小さくなく、自分にとって不要な内容が含まれる場合もあるため、学習内容は絞り込んだ方が効率的。
学んだ後、すぐ実践に使えるとも限らないので、学習を早めに終えて、実践で試行錯誤を繰り返す時間に当てた方がよさそうと感じています。
半端な理解ではバグを作り込む可能性がありますが、バグを抽出するテストを十分に行うことで対処可能。
どうやって、必要なところをだけに絞り込むか?
僕のやっている絞り込み方は、あいまいな表現からどんどん分解して、具体的で単純な振る舞いに落とし込んでいくようにしています。
もう少し具体的に書くと、数字や文字やバイナリとして扱う、メモリの確保や解放、ファイル書き出し/読み込み操作などコーディングのイメージが湧くくらいの粒度に分解していますね。
おおまかな例を書くと、次のようになります。
メモを保存する
→140字のテキストをファイルに書き出す
→長さ140の半角英語数字の文字列を、/xxx/yyy/zzz.txt のファイルに出力する
コーディングがイメージできる粒度まで分解できれば、学習予定のプログラミング言語を説明している書籍やWebで公開されているドキュメントのどこを見ればヒントになるか目星を付けられるので、効率が良くなり、細切れ学習もやりやすくなります。
もし当てが外れてしまったとしても、全く手が出せないという状況にはならなくて、周辺部分にヒントが無いか調査を進められるので、分解にミスがあっても大きな問題にはならないと思っています。
「分解できる人はプログラミング経験者だけで、初めて学習する人にとってはとても難しい作業では?」
確かに、経験者でないと分解がスムーズでないケースはありますが、入門者向けの書籍や解説サイトを2、3件ざっと目を通した後に、もう一度分解に取り組んでみると、最初の分解より粒度が細かくできるはずです。それでも、まだ十分でないと感じれば、自分が必要だと思う内容を読み返して、分解に再挑戦すればよい結果が出てくるでしょう。
この様に、自分のやり遂げたい内容を分解する作業と、プログラミング言語で行う処理の内容が、出来るだけ同じ粒度になるように続けていけば、プログラミング経験が浅い人でも結果は出せます。もちろん、経験の多い少ないによって、必要な時間は違ってきますけれど。
ここまでをおさらいすると、
やり遂げたいことを出来るだけ細かく単純な動作に分解して、その単純な動作について解説している書籍や公式サイトのドキュメントで学習していきましょう。分解の粒度は自分ならコーディングができそうと感じるくらいです。
プログラミング経験によって、やり遂げたいことの分解が上手く出来ない場合、入門者向けの書籍や解説を読んで分解に再挑戦を繰り返していけば、多少の時間は必要ですが、単純な動作まで分解できます。
まとめ
目的に合わせて、プログラミング言語学習内容を絞った学習の進め方について紹介しました。
僕もやり遂げたいことからコーディングが出来そうなくらいの単純動作に分解する作業に時間を取られて、何度も入門書や解説サイトを読み返す時間が長くなってしまうことが多いです。
入門者向けの書籍や解説サイトを参考情報として多数揃えておくと、分解作業時間を短縮できるかもしれません。
この記事が誰かの参考になれば幸いです。
この記事の参考資料です。

C/C++で組み込み系ソフトウェア開発の仕事を10年以上やっています。怪しげなデジタルガジェットが大好きです。