はじめに
株式会社ナレッジワーク CTO、株式会社ラムダボックス CEOの@mayahjpです。前回の記事では、プログラミング力とは何か、プログラミング力がなぜ重要なのかについてお話ししました。今回は、プログラミング力をどうつけるか、どれぐらい学べば良いかについてお話しできればと思います。
対象読者
- プログラミング力をつけたいが、何をどれぐらいやればいいのか指針が分からない方
プログラミング力をつけることは難しい
単刀直入に言います。プログラミング力をつけることは易しくはありません。学んでおくべきことは広範囲にわたり非常に多い上、様々な分野をそれぞれ身につけるのには時間がかかります。普通の方が、たとえ学校へ通おうとも、数か月学んだだけでまっとうなプログラミング力が付くという魔法のような方法はありません。
プログラミング力をつけるために学ぶべき知識・技術は一度学んで終わりではなく、新しい知識・技術が日々現れ、学んだそばから陳腐化していきます。他分野に比べると、IT分野は未成熟な上に変化も速い分野です。技術が進歩する以上のスピードで学び続けなければ、容易に振り落とされてしまいます。初心者を脱して技術がある程度分かるようになってくると、自分が学ぶスピードよりも技術が進歩するスピードの方が速く感じられる時期もあるでしょう。
一つ朗報があります。技術を学ぶスピードは、プログラミング力が高くなればなるほど速くなります。ある一定のレベルを超えれば、あまり時間をかけなくても新しい技術を習得できるようになります。新しい技術が現れても、大部分はどうせ前の技術の焼き直しです。したがって、本当に新しいことだけを学べば済みます。全く本当に新しい分野を学ぶ場合でも、一般的にはその分野の前提となっている別の分野があるはずで、その分野をある程度押さえていれば、本当に新しい分野の学習だけに集中できます。新たな分野でも必要に応じて勉強すれば良いという態勢を作ることができ、結果としてプログラミング力を維持することが易しくなってきます(全くやらないとどんどん錆びついていきますが……)。
この、わずかな努力でプログラミング力をある程度維持できるレベルに達することができると、その場その場の応用で様々な問題を解決できるようになります。いわゆるチュートリアルを終えた段階です。大変ですね。しかし、まっとうなシステムを作ろうとする人は、少なくともこの段階までたどり着くことが必要だと思います。
この段階にたどり着くには、何を、どの程度勉強すればいいのでしょうか。前回、プログラミング力を「知識」と「応用」の2つに分けて考えました。「知識」は、広範なIT知識からなり、「応用」は論理的思考力やうまくいくと分かっているパターン数からなると述べました。論理的思考力は普段から鍛えるのが早道だと思うこととプログラミング力に限らない汎用的な能力なのでここでは扱わないこととして、IT知識の獲得と、応用力をつけるためのパターンの習得について述べたいと思います。
知識を獲得する
まずは、IT知識の獲得に関してです。
ソフトウェアエンジニアになりたての頃は、キラキラした技術をやりたくて、Webサービスの作り方だとか、流行りの機械学習だとかに飛びつきたくなるのは嫌というほど分かります。実際楽しいですし、それがやりたくてソフトウェアエンジニアを始めた人もいるでしょう。ただ、基礎がないままに得た知識は、丸暗記した数学の問題の解法のように脆弱なものです。そのレベルでも、曲がりなりにもモノを作ることはできると思います。しかし、非常に限られたやり方で、限られたものしかできないでしょう。知識を似た問題に応用することもままならず、あるいは応用できない問題なのに無理やり応用しようとしてうまくいかず、と、その知識は役に立ちません。
おおよそ全ての技術は、なんらかの基礎的な知識・技術の上に成り立っています。基礎的な知識を得ることは、今後学ぶ知識・技術を獲得するスピードをあげるパッシブスキル(何もしなくても常時発動している特殊能力)のような効果があります。したがって、ある程度の時間を基礎的な知識・技術の習熟に投資することが、実はチュートリアルを終える近道です。
では、何から学べばいいのかですが、初期的な段階では私はIPAの情報処理技術者試験を受験し、それで足りない部分に関しては広く技術書を読むことを勧めています。
情報処理技術者試験
IPAの情報処理技術者試験は、基本情報技術者試験、応用情報技術者試験、高度情報処理技術者試験といくつかの段階があります。高度情報処理技術者のうちどれか1つに合格する程度までは勉強すると良いでしょう。
この試験は広く知識と応用力が問われますし、問題と正答・解説があるという形式は知識をつけるのにはかなり良いフォーマットで自学自習しやすいことも特徴です。また、試験という実力診断もついてきます。合格すれば履歴書にも書けます。一部のプログラマ界隈ではこれらの資格は無意味だと言われていますが、それは資格が無意味なほどプログラミング力がある人々が言っているので、無視してもいいです。高度情報処理技術者の資格が履歴書に書かれていてプラスになることはあってもマイナスになることはまずないです(プログラミング歴が長いのに基本情報技術者の資格だけが書かれた履歴書を見ると、何かあったのかなとは思います)。
初心者の状態から始めると、応用情報技術者に合格するまででも勉強時間がおよそ数百時間必要と思われますが、プログラミング力をつける上ではほぼ必要な知識ばかりなので全く無駄にはなりません。
ただし、情報処理技術者試験だけだと知識が浅く広くなりがちです。何か特定のプログラミング言語や製品に依らない知識に出題が限定されているからです。そこで、特定の言語や製品特有の知識を得るために、何か別のもので深さを補う必要があります。
広く技術書を読む
深さを補うためには、広く技術書を読むことをお勧めしています。
ある技術を学ぶ場合、本当は公式のドキュメントがあればそれを読むのが最も良いです。しかし、チュートリアルを終えてない段階の場合、公式のドキュメントを「読めない」ということが容易に起こります。物理的に読めないというわけではなく、読んでも書いてあることの意味が分からない、理解ができないということです。そういう方を数多く見てきました。公式ドキュメントは、しばしば情報過多になるきらいがあり、特に初心の段階では情報量に圧倒されがちです。さらに、その技術を使うために必要な別の(例えばOSなどの)基礎的な知識が仮定されていることも多く、そうするとますます「読めなく」なってしまいます。もう一つの問題として、情報が英語しか無いことが多く、英語が読めなければ言葉の壁もありますます読めなくなってしまいます。
公式ドキュメントが読めない代わりに、みなが何を読んでいるかというと、ネット上のブログや技術記事だと思います。これらは玉石混交で、良いものもそうでないものも含まれています。ただ、その段階で「読める」レベルの記事で得られる知識は、断片的なものだったり、古かったり、動くように見えて本当は間違っていたりすることもあります。しかし、チュートリアルを終えてない段階では、真偽が判別できません。
技術書は良いとされているものをレベルに合わせて選べば、必要な知識がまとまっており、体系だって幅広く知識を得られ、実力をつける上では近道になります。