これは何?
エンジニアを目指して,または単なる資格取得,あるいはプログラミング教育の開始に見られるように,プログラミング学習が最近注目を集めているように思う.その学習を続けていくにあたって,どのようにして力をつけていくのか,どのようにしてモチベーションを保つのかについて私見を語る.
プログラミング学習サービスを批判する意図はさらさらない.
書籍や講座による勉強の問題点
新しい知識を身に着けようとするとき,我々は経験者に教えを乞う.知識やスキルの伝達は指導者から学生へ主に一方向に流れる.
日本の一般的な学校では(私は),こうした形で授業を受けた.私見ながらこうした学習スタイルは短期的な頭へのインプットには有効であるが,科目によっては不適切であると考えている.
例えば,世界史の場合その多くは知識ベースの内容が占める.特定の時代/地域の歴史について学ぶ場合,書籍や資料を当たると途方もなく時間がかかる.そこで知識をもつ経験者に教えを乞うという手段をとることで効率的に学習を進めることができる.しかし英語の場合はどうだろう.ベースとなる語彙/文法と,それを発話する機会が無ければ読み書きする力はつくものの言語の本質である実際の場で話す力が育たない.日本人が英語での発話を苦手とする場面は,学会でよく見る光景だ.
プログラミングは圧倒的後者の科目である.
インプットするだけでは上達などしないことを,最初に理解しなければならない.
上達のためには
では上達するにはどうすればよいのか.結果から言うと,アウトプットすることだ.
英語が自然言語とするならば,プログラミング言語は人工言語である.アウトプットできなければ無意味である.JavascriptやRailsならWebアプリケーションをつくる,CやC++なら組み込みやより低レイヤーの成果物をつくる,pythonであれば豊富なライブラリを使ってクローラをつくるのもいいかもしれない.
ここで作るものが何も見つからない,漠然とも思い描けないという人は目的を取り違えている可能性がある.プログラミング言語は手段であり,目的は成果物に向かうはずである.WebアプリケーションをつくりたいからJavascriptを学ぶ,という感じだ.
プログラミングには英語の特徴にはないアルゴリズムという特性もある.競技プログラミングはこれに特化した分野で,のめり込み言語に精通していくのも道としてある.
どちらにも言えるのは,プログラミング能力を上達させるのはとにかくコーディングすることだ.文法はgoogleを使えば何とかなる.googleを使う能力は開発能力に比例する(当社比)ので,結構重要なスキルだ.使えば覚える.最初に覚えるべきは基本的な構文だけだ.
では,とりあえず何か具体的な成果物が見つからない場合はどうすればいいのだろう.
つくりたいものをみつけるために:着想
自分が考える日々の生活の不便を見つけること.これに尽きる.例えば,私が以前紹介したコレは,就寝時に明かりを消すのが面倒だ,とふと思ったことがきっかけだ.
当たり前の動作に逐次疑問をもつこと.
もしくは,こうなればもっと普段を面白く過ごせると妄想すること.
これらに意識的に取り組むだけで,それまでとはだいぶ世界が違って見える.
このときに注意が必要なのは本当に実現可能なのか?という点だ.
例えば,機械工学の素人はいきなり自動車はつくれない.なので,少しずつそこに至るための要素(経験)を埋めていく.時にアイデアは寝かせることが大事だ.
つくりたいものをつくるために:設計
つくりたいもののイメージが固まってきたら,次はそれをどのようにして実装するのかを考える.
このときには,自分のもつ力で可能な設計を頑張る.何も最新のライブラリを使いこなせなくとも,いかにして実現に近づけるのかを考え続け,モノとして完成につなげることが大事だ.ライブラリを使いこなすのはモチベーションにも関わるが,ライブラリを適用するのは後でもできる.とりあえず手を動かし実装できる手段を考える.
つくる:実装
ここからやっとプログラミングの登場になる.
プログラミングとそのデバッグを繰り返すと,想定通りに動作しなかったりエラーに悩まされることになる.そのたびに原因をデバッガやGoogle検索,StackOverflowを駆使して解決していく.その作業は正直苦痛だが,クリアしていくごとに後々役立つ経験として蓄えられる.
公開する:モチベーション
成果物の実装にはパワーを要する.この労力が報いられなければその勢いは急速に衰えていくだろう.このモチベーションの維持として,私はSNSなどに公開することにしている.
人は何かしら他人から特に良いフィードバックを受けると嬉しいものである.
昔であれば個人サイトに掲載しひたすら頑張るしかなかったのであるが,現在ではTwitterやYoutubeなど,いくらでもメディアはあるのだ.使わない手はない.
そこで得られたフィードバックを基に,次の作品へとつなげていく.
フィードバックには,UXの向上やライブラリのアドバイスなどさらなるアプリケーションの改善が含まれるかもしれない.
このループを維持することで,自身のステップアップにつながる.継続的な取り組みが大事なのだ.
まとめ
プログラミングの上達のために,私は学習だけでなくそのアウトプットが必要だと考えている.そのアウトプットは1日にしてならず,日々の生活の中での実装経験がモノをいう.
実装は苦痛に満ちているが,その中で遭遇する経験は必ずあなたを成長させる.
成果物は公開し,それを自身のモチベーションや成長へとつなげるのが大事である.
これを繰り返すことで自然といわゆるプログラミング能力が向上し,かつより生産的な日々を送ることも夢ではないと私は考えている.