プログラミング初心者にとって、プログラミング学習をどのように進めていけばよいか悩むこともあるでしょう。
今回は、私が学んだ経験を踏まえ、独学で効率よくかつモチベーションを保ちつつプログラミング学習を進める方法を紹介します。
この記事を読むことで以下がわかります。
- プログラミング学習を、効率よく、モチベーションを維持しながら進めるためのステップ
- 各ステップで、具体的にどのようなことを行えばよいか、何がポイントなのか
YouTubeの動画も作成していますので、よかったらこちらもご覧ください。
おすすめするプログラミング学習方法
プログラミングを効率よく、モチベーションを維持しながら学ぶには以下のような方法が良いと考えます。
- 最初にざっくり概観・雰囲気を学びます。
- 目的意識を持って作るプログラムを決め、それを作りきります。
- 1つ何かを作り切ったら、(1)よりももう少し体系的・網羅的にプログラミングを学びます。
- 更に、(1)~(3)の各ステップで、わからない点は自分より知識のある人に聞いて相談できるとより理想的です。
(1)、(2)は、その作る過程において最低限必要となる知識を学びます。
個人的には、(2)で一番プログラミングの力が伸び、かつプログラミングの楽しさを感じるところかと思っています。
そして、レベルを少しずつ上げながら(2)、(3)を繰り返します。
著者の体験に基づいたプログラミング学習方法の具体例
学習方法についてイメージを掴んでもらうため、高校生のときに独学でプログラミングをはじめ、趣味が高じてIT企業へ就職し今に至っている私の経験を元に具体例を紹介します。
昔の話なので、現在とは状況が違いますが、本質的な部分は今でもそれほど変わっていないかと思います。
私の人生におけるプログラミング関連の経験を簡単に時系列にまとめると以下のようになります。
- 小中学校:スーパーファミコンのRPGツクール、デザエモンなどを触りゲーム作りに興味をもつ。
- 高校:PCを買ってもらい、独学でプログラミングを勉強する。
(今回の話です) - 大学:情報科学を学ぶ。
- 就職:大手IT企業へ入社し、今に至る。
20年以上前(1990年代後半あたりです)、私は高校生のときにゲームを作りたくて、独学でプログラミングを始めました。
高校入学祝いとして、プログラミングを行うために買ってもらったPCはWindows98マシン(HDDが20GB、メモリが64MB)でした。
当時はインターネットの黎明期で、常時接続できる高速な回線はあまり普及しておらず、今のようにWeb上にあまり充実した情報はありません。
高校ではゲームを作る部活へ入部し、先輩にプログラミングに関する相談をすることができました。
これは恵まれていた点ですね。
だから、日中の授業中はいつも眠いのです…(笑)
私のプログラミング学習方法を、(1)~(4)のステップに沿ってみていきましょう。
(1)ざっくり概観・雰囲気を学ぶ
私はゲーム開発がしたかったため、先輩からのアドバイスもあり、C++言語を勉強することにしました。
まずは最初にC++の入門書を読みました。
しかし、最初に読んだときは書いてあることの10分の1も理解できませんでした…。
コンソール画面へ文字列を表示する方法、整数型といった型の概念、if文・for文といった制御構文など基礎中の基礎の要素について、なんとなくぼんやりとわかった程度です。
これを使ってどうゲームを作れるのかというイメージがあまり湧いていない状態です。
この時点では、ポインタ、オブジェクト指向、ファイル入出力など難しそうな部分はかなり読みとばしていたかと思います。
それでも、「(2)目的意識を持って作りたいものを決め、それを作りきる」でも後述するように後からなんとかなりました。
「(1)ざっくり概観・雰囲気を学ぶ」段階では、全て理解しきる必要はないのです。
その知識が必要になったときにまた戻ってきて理解できればよいのです。
私が高校生の頃は本を読むぐらいしかできませんでしたが、今だと以下のような方法でも良いかと思います。
- Webの記事を見る
- YouTubeなどの動画を見る
- プログラミング学習サイトを使う
しかし、当時は本格的にゲームプログラミングを勉強しようと思ったらC++を学ぶという雰囲気でした。
「(1)ざっくり概観・雰囲気を学ぶ」ステップでは、
- 全てを理解しきる必要はない。必要に応じて後から学べばよい。
(2)目的意識を持って作りたいものを決め、それを作りきる
(そのために必要な知識を学ぶ)
目的意識を持って作るものを決める
私の入っていた部活では、毎年、文化祭で作品を展示していました。
そこで私はグラフィカルなUIをもつクイズゲームを作成し、来客者が実際に遊べるように展示しようと考えます。
ここで、以下の明確な目的ができたわけです。
文化祭当日(デッドライン)までに来場者が遊べるレベルのクイズゲームを作成
必要な知識を学びながらプログラムを作りきる
それからは忙しくなり、文化祭当日まで大変でした。
とにかくプログラムを作り上げるという目的を達成するため、本を読み直したり、先輩に聞いたりと、あらゆる手段を使ってなんとか当日までに完成させました。
今でも覚えているのが、クイズゲームの問題出題部分のコードです。以下のように書いていました。
このようなクイズゲームを作り切るという目的のもと必要に迫られ、switch文やランダム関数の使い方を実践的に学んでいきました。
switch文で問題全てをハードコーディングするというダメコードの見本になっていますね。
まあ、プログラミング初心者の書いたコードということでご愛嬌というところでしょうか。
実践を通じて学んだこと
いまにして思うと、この経験を通して以下のような色々なことを学びました。
- 型、制御構文などの実践における使い方
- デバッグの大変さとprintfを使った基本的なデバッグ方法
- 事前に動作確認する(テストをする)ことの重要性
(来客者のゲームプレイ中にバグが…) - チーム開発の大変さ(問題文を他の人と分担して作ったため)
- スケジュール管理の重要性(徹夜でデバッグすることになり反省)
- 実装が難しいものは諦めるか代替案を考えるという柔軟性
- 自分の作品を作る楽しさと喜んでプレイしてもらえる充実感
ここで学んだことは、実は企業の実務で行うプログラミング・そしてソフトウェア開発においてもとても重要なことなのです。
これらのことは、あまり目的意識なく練習でプログラムを作ったり、本を読んだりといったことではなかなか身につきにくいことかと思っています。
「目的意識を持って作りたいものを決め、それを作りきる」ときに、その手段としてプログラミングを使っていく中で身につくのです。
作るプログラムの題材は何がよい?
私の場合は文化祭の展示物でしたが、例えば以下のようなものを作ってみるのもよいのではないでしょうか。
- (a)自分が生活の中で使うアプリを作る(例:家事管理用のアプリ、資産管理用のアプリ)
- (b)簡易なユーティリティツールをオープンソースやフリーウェアで公開する
(例:動画編集ソフトの補助ツール) - (c)ゲーム作品を作りWeb上で公開する(まずは動画公開もあり)
ポイントは自分が目的意識をなるべく持ちやすく、モチベーションを維持しやすいものを選定することです。
(a),(b)は、自分や世の中の人が課題に思っていること(不便に思っていること)を解決するというモチベーションになります。
創作が好きならば(c)のようにゲームなどの作品を作るのも良いでしょう。
なかなか完成しないとモチベーションの維持が難しいためです。
「(2)目的意識を持って作りたいものを決め、それを作りきる
(そのために必要な知識を学ぶ)」ステップでは、
- 自分が目的意識をなるべく持ちやすくモチベーション維持しやすい題材を選び、そのプログラムを作りきる
- 実践の中で必要に迫られて学ぶと効率よく知識を身につけられる
- 小さなソフトウェア開発プロジェクトを1サイクル行うことで、コードを書くだけではなく「ソフトウェア開発」において大事なことを学べる
(3)体系的・網羅的に学ぶ
クイズゲームを作りきった後に、前に挫折していたC++入門書をもう一度読んでみました。
すると、以前よりも理解できる部分が増えていました。
例えば、以前は読み飛ばしていたファイル入出力について、
- これを使ってクイズゲームの問題文をテキストファイルにすれば、プログラムから問題文を分離できるのではないか?
- 問題文がテキストファイルとして分離できれば、問題文を追加したときに毎回コンパイルする必要もないし、問題作成の分担も楽になるかも!
といった具合に、前よりも内容の理解が進むのです。
これは、クイズゲームを開発するという実践を通して、プログラミングにおける問題意識が肌感覚として身についたためです。
プログラミングにおける問題意識を身につけた状態で、プログラミングの体系的・網羅的な内容を勉強したときのイメージは以下になります。
クイズゲームの問題文をプログラムから分離するためにファイル入出力を使えそうだとわかることは、「概念」と「問題意識」が結びつき、理解の範囲がひろがる一例です。
実践を積み重ねることで、様々な問題に直面し、それに対する理解を深めることができます。
「(1)ざっくり概観・雰囲気を学ぶ」のステップと同じで、もちろんここで全てを理解できる必要はありません。
そのときは理解できなくても、頭の片隅においておけばよいです。
将来、新たな問題に直面したときに、思い出して参照することで理解を深めていけます。
プログラミング言語における様々な概念は、プログラミングやソフトウェア開発で生じてきた様々な問題を解決するために存在しています。
例えば、以下のような仕組みは全て、プログラミングの進化の歴史において、様々な問題を解決するために先人たちが発明したものです。
- オブジェクト指向
- ジェネリクス(総称型)
- デリゲート・ラムダ式
このような先人たちの知恵を効率よく吸収しながら、プログラミングを学んでいくには、以下の(2)と(3)のサイクルをまわしていくことが大事なのです。
- (2)目的意識を持って作りたいものを決め、それを作りきる
(そのために必要な知識を学ぶ) - (3)体系的・網羅的に学ぶ
高校生の私は(2)と(3)のサイクルを回しながらレベルアップしていき、高校三年生の文化祭では3Dグラフィクスを使ったアクションゲームを開発して展示しました。
簡単なクイズゲームからだいぶ進化しましたね。
DirectXというゲーム開発用のライブラリに関する本が充実していて、片っ端から読んでいました。
「(3)体系的・網羅的に学ぶ」ステップでは、
- プログラミング実践経験で問題意識を肌感覚として持てていると、プログラミングの様々な概念が理解しやすくなる
- 体系的・網羅的な知識を効率よく身に付けてレベルアップしていくためには、(2)と(3)のサイクルを回す
(4)わからない点は人に教えてもらう
(2)と(3)のサイクルを回しながらプログラミングの勉強をしているときに、どうしてもわからない点は、自分よりも知識のある人に聞けると良いですね。
私の場合は、部活の先輩にすぐに聞くことができたので、恵まれた環境でした。
具体的には、以下のような点を聞いて相談できたのは助かりました。
- プログラムを作るときの言語・ライブラリ選定や設計などの全体的な方針
- プログラミングにおける概念でどうしても理解できない点を腹落ちするまで聞く
- 自分の作っているコードで学んだ知識をどう具体的に実践するか
- 環境構築やデバッグで行き詰まったときの打開策
これらは、本を読んだり、一人でプログラミングをしているだけではなかなか難しい点です。
例えば、「学んだ知識をどう具体的に実践するか」について考えてみましょう。
さきほどの例で、「ファイル入出力」の知識を使えば、クイズゲームの問題をテキストファイルとすればプログラムから分離できるところまではわかったとします。
しかし実際にこれを具体化するには、そのテキストファイルをどのようなフォーマットにして問題をどのように格納するかなど、色々と考えて決めていく必要がありますね。
「知識としてある程度理解している」ことと、「自分がもつ具体的な問題に適用して実践できる」ことの間には隔たりがあるのです。
このような隔たりを埋めるためのサポートは、人間以外では困難でしたが、今ならばChatGPTに聞くというのもありでしょう。
例えば、クイズゲームの問題をテキストファイル化するときのフォーマットや読み込み方法についてChatGPTに聞いてみたら、以下のように具体案を示してくれました。
ChatGPTはポジティブでけっこう褒めてくれます(笑)
なかなか教え方が上手いですね。
ChatGPTの回答が正しいという保証はない点に注意が必要です。
ただ感覚的にはメジャーなプログラミング言語に関する基礎的な質問であれば、かなり正しく回答してくれるので、プログラミング学習で使わない手はないかと思います。
正確な情報源(本など)と併用するとよいでしょう。
私自身、プログラミング関連で新しいことを学ぶときには、ChatGPTをかなり使っています。
「(4)わからない点は人に教えてもらう」では、
- 周りに相談できる人がいなければAI(ChatGPTなど)を有効活用する
まとめ
紹介したプログラミング学習の方法について、ポイントを整理します。
(1):まずは、本やWeb上の記事、動画などでざっくり概観・雰囲気を学びます。
この時点では、全て理解しきる必要はありません。次の(2)で必要になったときにまた戻ってきて理解できればよいのです。
C#入門編では、C#プログラミングについてざっくり概観・雰囲気を学ぶための記事や動画を作っていますので、興味があればご覧ください。
(2):目的意識を持って作りたいプログラムを決め、それを作り切ります。そして、そのために必要な知識を必要に応じて学びます。
プログラムを作る過程で、様々な基礎知識をどう実践に活かすかという学びがあります。
(3):本などを読み体系的・網羅的に学んでいきましょう。(2)の経験があれば、以前よりも理解しやすくなっているはずです。
体系的・網羅的に学ぶにはやはり本がよいかと思います。
そして、(2)と(3)のサイクルをまわして徐々にレベルアップしていきましょう。
(4):周りに気軽に聞ける相手がいると良いのですが、社会人になるとなかなか難しいかもしれませんね。
ChatGPTも活用してみると良いと思います。
プログラミング、ソフトウェア開発においてどのようにChatGPTを活用するかについては、以下もよかったら参考にしてください。
独学のプログラミング学習で悩んでいる方への支援もしていますので、是非こちらのページからご相談ください!
本記事は、フリーランスHub(レバレジーズ様)【参考:案件一覧】にメディア掲載されました!
こちらに掲載されています。