ホームお問い合わせプロフィール未経験→就職転職合格率年収の相場ブラック企業判別定時帰りする方法

プログラマーSEの『やってはいけない勉強法』

2016年10月29日に投稿 → に更新 勉強法 アフィリエイトリンクを含みます

「やってはいけない」とやや釣りっぽいタイトルですが、実際良くない勉強法というのはあります。

その典型は勉強のための勉強です。

私がやってしまった失敗談を踏まえて、『やってはいけない勉強法』と『やるべき勉強法』を紹介します。

私の失敗例

私が失敗した勉強は、関数型言語を学ぶために勉強したことです。

関数型言語を使って何かを作りたいというのならいいんですが、私の場合そうではなく、

「関数型言語を学ぶと関数型の考え方が身について、それがふつうのプログラミング言語(手続き型とかオブジェクト指向)を書く際にも、活かせるんじゃないか?」

というモチベーションで関数型言語を勉強していました。勉強のための勉強だったんです。

Common Lisp, Clojure, Haskell, F#, Scalaといろいろやりましたが、どれも身につきませんでした。関数型言語がどういうものなのかという知識は身につきましたが、実用的なスキルにはなりませんでした。

なんでそうなったかというと、目的がなかったからです。

目的のない勉強は身につかない?

学ぶ内容がかんたんなものであれば、目的がなくてもある程度身につきますが、関数型言語のようなパラダイムが違うものを目的なしに学ぶのは難しいものです。

ですから、関数型言語を使って「副作用のないプログラミングをする必要がある」とか、「次入るプロジェクトで関数型言語を使う」などのような目的があれば、結果は全然違ったはずです。

私が関数型言語を学ぼうと思った理由は「関数型言語を学ぶことで、ふだんのプログラミングにも関数型の考え方を取り入れたい」というものでしたが、これってもっとかんたんな勉強法があります。

現代の主要なプログラミング言語の多くは関数型言語の機能をいくつか取り込んでいます。

  • 関数が第一級オブジェクト
  • 高階関数

という機能です。これってわざわざ関数型言語を学ばなくても、自分が使ってる言語で高階関数の使い方を学べばいいんです。

関数型言語を学ばなくても、「関数型的な考え方」は身につけられる

私は以前、高階関数の使い方がよくわかってなかったんですが、node.jsをやったら嫌というほど、高階関数を使うことになり、自然と覚えてしまいました。

node.jsってサーバーサイドのJavaScriptなんですけど、IOが発生するたびに、IOの結果をコールバック関数(処理が終わった時に呼ばれる高階関数)で受け取らなければならないので、DBアクセスするたびに高階関数を使うこととなり、めんどくさいなぁと思いながらも、そうやる以外に方法がないので、強制的に高階関数を使ったコードを書くようになりました。

すると、node.jsじゃなくC#やRubyのコードを書く時にも高階関数をふつうに使えるようになったんです。

ですから、勉強のための勉強じゃなく、使ってるうちに自然と覚えてしまったっていうのが一番です。

同じような考えで、「関数型言語は再帰処理が多いので再帰処理の考え方も学べそう!」とも思っていたのですが、これも関数型言語を学ばなくたって学べます。

再帰はむやみに使うものではない

関数型言語はループも再帰で行うので、再帰をつかう頻度は高いのですが、むやみに再帰を使えばいいというものでもありません。

手続き型言語で配列のループを再帰で実装したらロジックがわかりにくくなります。再帰構造のデータを扱う時にこそ、再帰を使うべきです。

よくあるコードサンプルにディレクトリ走査をするものがあります。あるディレクトリ配下のファイルとディレクトリを全て処理する場合に、再帰処理によって、配下のファイル全てを走査することができます。

ディレクトリは再帰構造(ディレクトリの中にディレクトリがある)なので、再帰処理がピッタリです。

ですから、再帰処理を学びたいなら、ふだん自分が使ってる言語のディレクトリ走査のサンプルコードを見ればいいだけです。

そんなわけで、勉強のための勉強ではなく、「目的を達成しようと試行錯誤してたら自然と身についた」となるやり方を心がけていきたいと思います。