私は現在、子供向けにScratchでプログラミングを学ぶ講座を提供しています。Scratchは子供だけでなく、大人にとってもプログラムの原理を簡単に楽しく学ぶことのできるツールだと思います。
私がこの講座の提供をしている理由は、プログラミングを通して、思考力、論理力、数理的思考、表現力を身につけてほしいと考えているからです。この点については過去にプログラミングで身につくことでまとめました。
しかしながら、プログラミングそのものを身につけたいと考えている人もいると思います。そこで今回は、プログラミングの勉強法について、私自身の経験をもとに考えてみようと思います。
1. 大学時代のプログラミングの授業を振り返る
私がプログラミングを身につけたのは大学時代です。工学部情報工学科でコンピュータを専門的に学びました。ソフトウェアを中心に据えたカリキュラムであったため、プログラミングの勉強が生活の中心でした。
1.1 プログラミングに関する講義
プログラミング言語について机上で勉強する講義は大学4年間で1年生の前期1コマだけでした。あとは全てコンピュータの前に座って黙々とコーディングを続ける日々を送りました。具体的には下記の内容を記憶しています。
- UNIXとプログラミングの基礎
- C言語プログラミング
- 構造化プログラミングの基礎(逐次処理、条件分岐、繰り返し)
- データ処理、ファイル操作、ポインタ、関数ポインタ など
- CUIプログラム
- GUIプログラム(X-Windowを使った操作、イベントドリブンプログラム)
- 並列処理:スレッドとプロセス
- TCP、UDP通信プログラム
- 画像処理プログラム
- OpenGLを使ったCG制作
- Windowsプログラミング
- Windowメッセージの仕組み
- イベントドリブンプログラム
- TCP、UDP通信プログラム
- 通信を使った対戦型ゲームプログラミング
- Database
- オブジェクト指向プログラミング
今現在、思い出せる限りを列挙しましたが、自分でもよく頑張ったなぁと思います。
上記のプログラミング関連の他に、コンピュータ内部の動きや通信の仕組みを実験を通して学ぶ講義、コンピュータで使われる理論の講義、プログラミングのアルゴリズムに関する講義、暗号理論に関する講義などがありました。
私が通った大学のカリキュラムの良い点は、理論を学ぶ座学の講義とプログラミングの講義が連動していたことです。例えば、アルゴリズムの講義で計算速度とアルゴリズム設計との関係を学び、プログラミングの講義ではそのアルゴリズムを使って課題を制作するといったことがありました。理論を学びながら、具体的にどのように実現すれば良いのかを学ぶことができたと思います。
1.2 プログラミングの授業内容
上記の内容は、どのような方法で実施されていたか。ご紹介します。流れはとてもシンプルで、下記のようになっていました。
- 課題と締め切りが提示される
- 締め切りまでにレポートを提出する
- レポートが受理された人は口頭試問を受ける
- 口頭試問が合格になれば単位がもらえる
基本的に先生による全体への説明の時間はありません。学生はそれぞれテキストに沿って自分で課題を進めます。先生は困った時に相談すれば、的確にアドバイスをくれる存在でした。出される課題は、授業時間だけコンピュータ室でプログラミングをすればクリアする内容ではありませんでした。学生の私たちは次々に出される課題をクリアし、レポートを書き提出するために時間が空けばコンピュータ室にこもっていました。コンピュータ室でプログラミングを行っていると、その流れのまま授業時間になり、先生がやってきてウロウロして、時間が終われば先生は去って行き、次の講義がない場合は学生たちはそのまま作業を続けるという日もありました。
プログラミングの授業で良かった点は、レポートをしっかりときちんとまとめることが要求されたことです。自分が作成したプログラムについて、仕様書、アルゴリズムなどをまとめ、実行結果を示し、考察を書くという作業を行ううちに理解がさらに深まったと思います。さらに、レポートについて、課題を出した先生と個別に口頭試問が行われたことも良かった点です。誰かのプログラムやレポートをコピーして提出しただけでは、口頭試問に受かりません。きちんと理解することが求められました。
2. どうしたらプログラミングが身につくか
私が大学で学んだカリキュラムは、コンピュータの世界やプログラミングを学ぶのにとても良いカリキュラムだったと思います。
しかしながら、これからプログラミングを身につけようとする方は、大学で学ぶ人ばかりではありません。そこで、上記の経験を通して考えるプログラミングの身につけ方をまとめたいと思います。
2.1 ひとつの言語をメインにする
いろいろな種類のプログラミングを試す前に、ひとつの言語について理解を深めましょう。プログラミングの仕組みや基本的な考え方は、どの言語でも同じです。ひとつの言語で基本を理解すれば、他の言語にも応用ができるようになります。
私は大学で主にC言語を学びました。C言語で良かった点は、ポインタ、アドレスと値の関係を意識してコーディングする機会があったことです。ポインタやアドレスはプログラムがコンピュータ内に格納されている場所を示します。少しだけハードウェア寄りのプログラミングを経験したことで、後々プログラムが動くメモリの存在を理解できるようになったと思います。プログラムとハードウェアの関係の理解につながりました。
2.2 設計を行い、具体的にプログラムで実現してみる
設計とは、プログラム内部のデータ構造を検討したり、効率の良い処理手順(アルゴリズムと呼ばれます)を考えたりすることです。あらかじめプログラムの内容を検討することで、コーディングの時に設計方法の誤りや不足の点に気づくことができます。
最初はプログラミングの世界で一般的なアルゴリズムをプログラムで実現することから始めるのも良いと思います。例えばソートプログラムです。数字やアルファベットを昇順や降順に効率良く並べる方法がたくさん公開されています。バブルソート、ヒープソート、クイックソートなど名前の付いているアルゴリズムがたくさんあります。プログラムも公開されています。有名なアルゴリズムを理解し、プログラミングしてみることで、アイディアをプログラムで実現する方法を少しずつ理解できると思います。
2.3 様々な種類のプログラミングに挑戦する
様々な種類というのは、「様々な言語」ということではありません。
- イベントドリブン:ユーザの操作によってソフトウェアが反応するプログラム。GUIを作るときには必須の考え方。OSとプログラムとの関係、APIを使ったプログラムの考え方が身につきます。
- ネットワーク:IPアドレスやネットワークの仕組みを利用したプログラム。インターネット通信を利用したサービスの提供に役立つ考え方も理解できます。Webサービスの開発、Web APIの開発につながります。
- 並列分散処理:マルチスレッド、マルチプロセスの考え方に基づきます。ひとつの処理を複数に分割して実行する考え方、高速処理や内部で役割分担を行うソフトウェアの開発に役立ちます(例えば、画面描画の裏でデータ通信を行うネットワークゲーム、一つの仕事を複数のコンピュータで実行するプログラム、ディープラーニングに代表されるAIの開発など)。
- マルチメディア処理:写真やCGなどの画像、音声、動画に関する処理をプログラムで行います。映画やゲームで使われている技術です。
上記のような内容で興味のあるところを深めていくと、その道のプロになれるかもしれません。より深いところを身につけようとすると、コンピュータアーキテクチャ(コンピュータのハードウェアの設計や構造)まで考慮が必要な場合もあります。勉強すればハードウェアの知識も身につくということです。
2.4 とにかくたくさん書く
プログラミングはとにかくたくさんコーディングすることが重要です。手を動かした分だけ身につきます。
英語やフランス語などの言葉も同じだと思います。日本語は子供の頃から使っているので自然に話せます。英語も英語圏で生活し、必要に迫られれて話していれば話せるようになると思います。話していなければ忘れますが、思い出せます。
プログラミングも同じです。たくさんのプログラムを書けば、書いただけの内容が身につきます。忘れても思い出すことができます。
また、たくさん書くことは、同じだけエラーも起きます。トライ&エラーを多く経験すればするほど、エラーが起きた時の対処方法を知識として蓄積することができます。これにより、自分が使っているコンピュータやスマホの中で何が起きているかが想像できるようになります。
プログラミングを学ぶとある時点でプログラミングしなくなる人もいます。それでもプログラミングの知識が無駄になることはありません。社会や自然に興味を持ってその中で役立つサービスをふと思いつく瞬間があると思います。誰かにサービスの制作を頼んだり、自分で作ったりする際、かつて身につけたプログラミングの知識が役に立つと思います。
2.5 どの言語で始めれば良いのか
あなたは何を実現したいですか?
ゲームを作りたいですか?Webサービスを作りたいですか?スマホアプリですか?目的を決めてそれに適した言語を選択するのが良いと思います。
下記に私のオススメの言語を列挙します(実際に使ったことのない言語も含まれます)。
- C言語:構造化プログラミングの基礎を学ぶには良いと思います。勉強用かなぁ。。。という感じがします。
- MySQL:データベースの基礎(データベースの構築、操作)を学ぶのに良いと思います。
- Java:オブジェクト指向プログラミングを学ぶのに最適。Androidアプリ、Webサービスの開発ができます。
- JavaScript:ユーザ操作に応じた動きのあるWebサイトを作りたい場合に最適です。
- Ruby:データベースを使った Webサービスを作りたい場合に最適です。
- Swift:iOSやOS Xで動くアプリ開発に最適です。
- Scratch:ビジュアルプログラミングツールのひとつです。子供でもチャレンジしやすく、プログラミングの基本的な考え方が身につきます。
他にもR、Python、PHPなどたくさんの言語があります(オススメの言語がある方、情報提供お待ちしております)。環境構築から始めずに、とりあえず試すだけしてみたい方はオンライン実行環境のPaiza.ioがオススメです。ブラウザ上でコーディングと実行ができます。
3. できればプログラミングの勉強と同時にやってほしいこと
コンピュータ以外の分野にも興味を持つことです。
暮らしの中で困っていること、便利だなと思うことについて、その理由をちょっとだけ考えてみてください。その理由が、利用者目線の便利なソフトウェアの開発につながる視点になります。
コンピュータは、趣味や生活など、暮らしの中で活用されてこそ利便性が大きく発揮されます。天気予報のために大規模で高速処理の計算が求められていたり、どこでもお金が下ろせるようにATMが開発されたりしています。暮らしを便利にするためにコンピュータは発達してきました。
コンピュータの世界にとどまらず広い視野を持つことが、便利なソフトウェアや人を楽しませるソフトウェアの発想のきっかけになると思います。