- 「独学によるプログラミング学習は無理だ。」
- 「どうすればプログラミング課題を解決/解消できるのか。」
上記のようなプログラミングにおける悩みがしばしば見かけられます。
筆者の結論は、目的に対する逆算思考からプログラミング学習を考えることです。
本記事では、プログラミング未経験/初心者が独学でどのようにプログラミングと向き合うか詳細に解説します。
本記事の対象者
大前提として、プログラミング学習において目的・目標が特に設定されていない人は対象外になります。
独学によるプログラミング学習はやめとけ問題
- 独学によるプログラミング学習は十分可能である
- プログラミングスクールを検討したほうが良い
上記の対立意見がプログラミング業界ではよく見かけられますが、個人的に深堀りすると以下の要素が独学のハードルを高めていると考えてます。
- 学習によって実現したい目的/目標設定
- 学習内容の取り決め
- 学習レベルの基準
- 学習時間の確保
- 学習計画の具体的なスケジュール管理
- プログラミングにおける悩み/エラー解消などの学習環境
- エンジニア就職/転職の具体的な実現方法
要するに、目的達成するためには純粋なプログラミング学習のみとはいかず、学習計画に脳みその思考を奪われてしまいます。
仕事や生活と並行してプログラミングスキルを習得したい人にとって、純粋なプログラミング学習以外の時間は短縮したいはずです。
独学によるプログラミング学習の難しさを詳細に知りたい人は「【プログラミング独学】初心者はやめとけと言われる理由と唯一の解決策」を一読ください。
独学によるプログラミング学習は無理なのか
当然ながら、「独学ではもう無理。」と挫折や諦めを抱いて手を止めてしまった人は、今後のプログラミング学習は無理でしょう。
ただ、一度これまでのプログラミング学習を振り返り、独学によるプログラミング学習は無理なのか判断しても良いと思います。
- 思い通りの学習ができていない
- 未知の問題が解決できない
まず独学によるプログラミングの悩みを大別すると、上記のパターンに分けられると考えています。
独学によるプログラミング学習が思い通りにできていない
おそらく、大半のプログラミング独学は思い通りの学習ができていないことが原因の一つだと考えます。
プログラミングに限らず、一般的に好循環な学習サイクルは以下の流れです。
- そもそも学習内容と達成基準から考える必要がある
- 適切なコーディング課題を探す必要がある
- 純粋なプログラミングへの思考時間が減少する
- コーディング作業時間が減少する
上記のような学習管理への脳のリソースがほとんど奪われてしまい、ようやく純粋なプログラミング学習に手を出すころには疲弊してしまいます。
だからこそ、ダラダラと学習しないために学習以外の管理を見直すことが人によって必要になります。
- 学習内容を見直す
- 学習レベルの基準を見直す
- 学習時間を見直す
- 学習計画のスケジュール管理を見直す
- 学習環境を見直す
詳細にプログラミング独学において準備しておくべきことを知りたい人は「【プログラミング独学】初心者はやめとけと言われる理由と唯一の解決策」を一読ください。
プログラミング学習はスケジュール管理が難しい
ここでは、例として1ヶ月間の基礎学習といった前提で以下の内容を考えてみます。
10日目で予定していたプログラミング学習が半分しか終わらなかった
何も考えず上記の内容を読み取ると、「え?1日だけ学習期間のスケジュールがズレるだけでは?」と感じます。
しかし、実際は本来1日で理解できる学習内容が半分しか終わらなかったということは、単純に今取り組んでる学習内容は2日間かかることになります。
すると、以降の学習内容も1日で終わる内容ではないと想定できるので一つずつの学習内容にかかる時間が多くなり、全体の学習期間が大幅にズレていきます。
さらに、課題解決/学習内容の理解ができない限り、日数だけ経ち学習進捗度が低下します。
独学によるプログラミング学習で未知の問題が解決できない
次に、目の前のプログラミング課題に対する悩みについて言及します。
いわゆるコーディング作業時のエラー対処や専門的知識の理解への取り組みについてです。
未知の問題が解決できない時の行動として、以下の方法が考えられます。
- 問題そのものを解決する
- 問題を問題でなくする
- 問題を具体的な課題に昇華させる
具体的な例を示しながら各行動を解説します。
問題そのものを解決する
問題そのものを解決することは、至ってシンプルです。
- エラー内容を検索/調査する
- プログラミングコードを見直す
単純がゆえに、エラー時はテクニックなど存在せずただただエラーと向き合う以外ありません。
また、コーディング作業はエラーとどれだけ向き合い、トライアンドエラーを繰り返すかです。
この地道な作業こそがプログラミングの経験値に変換され、今後のエラーから解決までの導く速度が高まります。
プログラミングにおいて避けられない課題は存在するため、愚直に取り組みましょう。
問題を問題でなくする
問題そのものを解決する一方で、現在取り組んでいるプログラミング課題が学習時間の無駄を生むケースも考えられます。
ここでは、プログラミング学習において3つの要素に分けて考えていきます。
- 学ぶべきこと
- 学びたいこと
- 学べること
個人的な見解ですが、プログラミング初心者は目的/目標が不明瞭の場合に無駄な学習を取り組んでいるケースが見受けられます。
例えば、特定のプログラミング言語における基礎学習に取り組んでいるケースを想定してみます。
- 学ぶべきことで、学びたくて、学べること
- 学ぶべきことで、学びたいこと
- 学びたいことだが、学ぶ必要がないこと
- 学びたくて、学べることだが、学ぶ必要がないこと
- 学べることだが、学ぶ必要がないこと
- 学ぶべきことで、学べること
- 純粋に学ぶべきこと
7分類に分けてしまいましたが、要は「学ぶべきこと」を念頭に学習の優先度を付けるのがよいです。
抽象的で端的にまとめますが、Pythonを例に以下の基礎学習におけるセクションが存在するとします。
- Python環境設定と構築
- Pythonの基本(変数,定数,数値,文字列など)
- データ構造(リスト型,タプル型,辞書型,集合型)
- 制御フロー(if文,for文,while文,continue文,break文,関数,try-except文など)
- モジュールとパッケージ
- 標準ライブラリ
- オブジェクトとクラス
詳細に取り上げればキリがないため、公式ドキュメントを参照してください。
このように、基礎学習といっても把握/理解しておくべきことは数多く存在します。
しかし、現役エンジニアであっても全てを把握し即座に使いこなしているわけではありません。
つまり、必要に応じた学習内容を勉強します。
以下は、if文/for文を例に必要に応じた学習優先度を示します。
if文の学習優先度
例えば、非常にシンプルなif文を以下に示します。
# 入力変数
flag = int(input("flagの値を入力してください: "))
# 条件に応じた出力
if flag == 1:
print("OK")
else:
print("NG")
次に、上記のプログラムよりも少し複雑な条件分岐のif文を以下に示します。
# 入力変数
flag = int(input("flagの値を入力してください (整数): "))
# 条件に応じた出力
if flag == 1:
print("OK - 値は1です")
elif flag == 2:
print("OK - 値は2です")
elif 3 <= flag <= 5:
print("注意 - 値が3から5の範囲にあります")
elif flag < 0:
print("エラー - 負の値が入力されました")
elif flag % 2 == 0:
print("NG - 偶数ですが特別な条件に該当しません")
else:
print("NG - 条件に該当しない値です")
実際に、プログラミング学習において様々な条件文を作成する機会があります。
しかし、簡単なものから難しいものまで共通するif文は、「Aという条件を満たす場合にBという処理を実行する」といった解釈になります。
基礎学習で重要なのは、「各学習内容で利用する構文/文法の本質を理解すること」になります。
あくまで複雑あるいは高度なプログラムを作成できるようになるかは別と考えてもよいと思います。
for文の学習優先度
例えば、入力値によって出力結果が変わるfor文を以下に示します。
# 入力変数
num = int(input("繰り返す回数を入力してください (整数): "))
# for文で数値を出力
for i in range(1, num + 1):
print(i)
次に、上記のプログラムよりも少し複雑なfor文(多重ループ)を以下に示します。
# インプット変数
num = int(input("ループ回数を入力してください (整数): "))
# 外側ループ
for outer in range(1, num + 1):
print(f"外側ループ:{outer}回目")
# 内側ループ
for inner in range(1, outer + 1):
print(f" 内側ループ:{inner}回目")
'''
実行結果(実行例:入力値が3の場合)
外側ループ:1回目
内側ループ:1回目
外側ループ:2回目
内側ループ:1回目
内側ループ:2回目
外側ループ:3回目
内側ループ:1回目
内側ループ:2回目
内側ループ:3回目
'''
if文の例と同様に、for文によるデータ出力結果を求める機会があります。
for文においても、本質は「特定の条件に沿って繰り返し処理を行う」ものになります。
このように、学習内容においても優先度を付けることで、「本来理解すべき概念の本質」と「現在取り掛かるべき問題か」を切り分けられます。
また、今目の前のプログラミング課題が困難であっても、思考する時間を増やしながら解決することで着実にできるようになります。
こなしていく中で「慣れ」というのは確実にあると考えます。
問題を具体的な課題に昇華させる
プログラミングにおいて、問題を具体的な課題に昇華させる方法があります。
分類すれば細かくできると思いますが、ここでは以下の分類で考えます。
- 考えたら分かること
- 考えただけでは分からないが調べたら分かること
- 考えても分からないし調べても分からないこと
また、プログラミング学習において既知の問題あるいは未知の問題と分類できると考えます。
問題の種類 | 説明 |
---|---|
既知の問題 | すでにプログラムを動作させてる段階で問題が起きている状態 |
未知の問題 | まだプログラムに落とし込む前の段階で問題が起きている状態 |
上記のケースにおいてそれぞれ考えていきます。
考えたら分かること
プログラミングにおいて「考えたら分かること」は、基本的にすでにエラーが発生している状態かと思います。
また、プログラミング初心者がエラーに苦しむ代表的なものが以下だと思います。
エラー名 | エラー内容 |
---|---|
構文エラー | 記述したコードの構文/文法が正しくない場合に引き起こる |
実行時エラー | 予期しない処理や想定外の動作により引き起こる |
論理エラー | プログラムの設計上の問題で引き起こる |
上記は、様々なエラーを大別した際にまとめたものになりますが、プログラミング初心者の場合によく発生するエラーは構文エラーと実行時エラーかと思います。
特に、構文エラーの場合は特定の処理に利用するコードの書き方を理解しきれず引き起こすケースが多いです。
また、実行時エラーも構文は正しいが扱う変数の使い方(インデックスエラーなど)が想定外のケースが多いです。
論理エラーに関しては、計算式の誤りや処理順序がおかしいなど、正しくない出力結果の場合に考える必要があります。
このように、すでにプログラムを動作させる段階での問題は、基本的に思考時間を設けることで解決できるケースがほとんどです。
なぜなら、すでにプログラム内の何かが正しくないと判断されているからです。
エラーが分かっている状態は、時間を設けて問題と向き合うようにしましょう。
考えただけでは分からないが調べたら分かること
次に、「考えただけでは分からないが調べたら分かること」は、既知/未知の問題どちらも発生するケースだと思います。
以下は、調べる(検索する)にあたって考えるべき内容になります。
既知の問題
- エラーを起こしている場合は、エラー文を検索する
- 関連ワードを洗い出し、参考情報をググる
未知の問題
- 仮説を立てて想定ワードを洗い出し、参考情報をググる
基本的にどちらにおいてもGoogle検索でヒットした10~20記事は確認しましょう。
一つの情報サイトになくても、かき集めることで解決するケースもあるためです。
また、基礎学習やアプリ開発入門レベルであれば、YouTube/Udemy/書籍にも手を伸ばすのが吉です。
考えられる検索パターンと検索媒体の切り替えを網羅的に実行し、あらゆる手段で情報収集しましょう。
特に、基礎学習レベルであればまず間違いなく解決します。
考えても分からないし調べても分からないこと
考えても分からずリサーチ不足でもない場合に、問題が解決しないのであればいよいよ学習のやり方を変える必要があります。
つまり、完全独学によるプログラミング学習は困難であると言わざるを得ません。
なぜなら、あなただけの力では解決できる状態じゃなくなったからです。
ただし、基礎学習やアプリ開発入門レベルで考えても調べても分からない状態の場合、「経験がない」よりも「思考が浅い」と考えます。
おそらく、ほとんどの学習者が同じエラーを引き起こす中で「乗り越えた人」と「無理だった人」に分けられているはずです。
実務レベルで世の中にないアプリ/サービスあるいは機能開発でない限り、本当の意味で無理ではないです。
「分かる人」がいる中で、「自分にはプログラミングは無理」と諦めグセがある人は極めて恥ずかしいです。
完全独学によるプログラミング学習は正しい判断なのか
一度、あなたの達成したい目的に立ち返ってみてください。
もちろん、完全独学によるプログラミング学習を継続する意志が固ければ、そうすればよいと思います。
ここでは例として、「短期間でエンジニアを目指す」といった目的を持ったプログラミング初心者がいると仮定します。
- プログラミング言語の基礎学習
- アプリ開発&インフラ学習
- ポートフォリオ作成
- スキルシート作成
- 経歴書作成&面接対応
- 就職活動&転職活動
上記のような学習ロードマップを具体化していくためには、目的から逆算思考を働かせる必要があります。
- 就職/転職するためにどんなエンジニアを目指すか
- 応募/面接時に必要な経歴書作成をいつから始めるか
- 目指すエンジニア像はどんなスキルシートが求められるか
- 求められるスキルはどんなポートフォリオを作成するべきか
- ポートフォリオとしてどんなアプリを開発すべきか
- アプリ開発のためにどの程度の言語基礎学習を実施すべきか
このように、具体的な学習ロードマップを作成するためには、目的に対する逆算思考から始めましょう。
しかし、エンジニア就職/転職の目的も含め、プログラミング初心者にとって逆算から学習計画を立てるのは簡単ではありません。
そのため、完全独学によるプログラミング学習が目的から正しい判断か考え直すのもありだと考えます。
完全独学のプログラミング学習に陥ってしまう理由
完全独学によるプログラミング学習に陥ってしまう理由は、以下が考えられます。
- プログラミング学習にお金をかけたくない
- どうせならまずは独学で挑戦してみたい
- 基礎学習だけなら自分にもできるかもしれない
当然、人によっては完全独学でプログラミングスキルを習得するケースもあります。
しかし、目的によっては学習難易度が高くなることや長期間を要することなど、独学の限界が訪れる人も少なくありません。
「独学」という勝手な縛りによってやり方をいつまでも生活を停滞させるのは、最も愚策であると言わざるを得ません。
例えば、「直近でまとまったお金がない」のであれば、数ヶ月貯めてからスクール検討やコミュニティ参加も無謀で不確かな挑戦よりよっぽど得策です。
考えなしの挑戦による挫折/諦め/目的断念よりも、数ヶ月の貯金や練りこんだ計画準備のほうが効果的な施策だと考えます。
コメント