- プログラミング学習が難しい要因を解剖
- 挫折箇所の対策を提案
- 学習計画の管理方法と考え方
上記をまとめ、プログラミング学習が難しいといった悩みを解消する考え方を提案します。
本記事の対象者
ここでは、「プログラミングが難しい」「何が難しいかわからない」など、プログラミング学習時に関する悩みを持つ人が対象となる内容になります。
独学によるプログラミングが難しいとは何か
個人的に独学やスクール問わず、プログラミング学習が難しい点は共通してると考えます。
ここでは、プログラミングの何が難しいか分解しています。
- プログラミング情報が膨大で整理できない
- プログラミング言語の基礎学習が難しい
- どうやってアプリ開発するかわからない
プログラミング初心者にとって難点はいくつか存在しますが、主に3つへ分類できると感じます。
さらに、分類した難点を分解すると学習ステップのどこで難しさを感じるか分かります。
漫然とプログラミングが難しいと思考放棄するのではなく、対策を講じる必要があります。
プログラミング情報が膨大で整理できない
現在はネット環境が整備されたことによって、PC/スマホから様々なプログラミング関連情報が確認できます。
また、プログラミング学習におけるオンライン教材/サービスも豊富で上手く情報収集すれば独学も可能です。
しかし、独学可能とはいえ誰もがネット情報の学習基準で学べるわけではなく、個々人の能力も少なからず影響します。
- プログラミングの何から始めるべきかわからない
- プログラミングにおける最適解とは何か
特に、「何から始めるべきかわからない」「コードの最適解とは」といった悩みが発生します。
ここでは、プログラミング学習における目的逆算思考や最適解に対する考え方を解説します。
プログラミングの何から始めるべきかわからない
即決してプログラミング未経験者がプログラミング言語学習を始めるのは注意が必要です。
なぜなら、目的や目標もなく漫然とプログラミング学習を始めると時間を溶かすあるいは挫折の原因になるからです。
例:◯◯受験に向けた学習
一度、想像してみてください。
高校受験/大学受験/資格試験など様々な受験がありますが、誰もが受かるための下調べを実施します。
あるいは、塾やサポートサービスなど学習環境を整備します。
どこまで計画的に学習行動してたか人によりますが、プログラミング学習も漫然と取り組めるほど簡単ではありません。
特に、自身で学習時間や独学など制限を設けると、純粋なプログラミング学習が進まないケースも多いです。
- 判断基準がないと正しいプログラミング情報かわからない
- 目的/目標未達成のままサンクコストだけかさむ
計画もなくがむしゃらに取り組んだ際、結果「何も達成してない」といった結末になります。
学習に迷いを生まないために、目的に合わせ情報の取捨選択から始めましょう。
具体的な学習計画の立て方は後述します。
プログラミングにおける最適解とは何か
プログラミング学習中のコーディングにおいて、膨大なコードを検索すると思います。
また、多くのコードを確認すると人によって記述方法は様々です。
プログラミング初心者は、コーディング時の最適解は何かを考えるケースがあります。
結論:動けば正解
プログラミング初心者の場合、プログラムが動くことから始めるべきです。
例えば、以下の要件を満たすPythonコードを記述するとします。
1から10の値を出力結果に表示する
for文の場合
for i in range(1, 11): # range(1, 11)は1から10までの整数を生成
print(i)
while文の場合
i = 1 # 初期値を1に設定
while i <= 10: # iが10以下の間ループを実行
print(i)
i += 1 # iを1ずつ増加
上記の要件を満たすのであれば、どちらも間違ってはいません。
プログラミング初心者が陥りやすい学習の妨げになる要因が以下です。
- 頑張ってプログラミングを覚えようとする
- 真面目に全てを理解するあまり勉強が進まない
可読性がある綺麗なプログラムや処理の高速化を図るパフォーマンス改善など、最適解を求めるほど難しさを実感します。
当然の結果で、誰もが理想とするコーディングを目指しますが、最初から狙って記述するのはやめましょう。
ましてや、公開されてるアプリなども日々アップデートを繰り返し、バグを減らしながら改善されています。
また、レガシーな技術であればシステムリプレイスが起こり、これまでの言語バージョンで記述されたコードは最適解ではなくなります。
いわゆるコードにおける負の遺産と呼ばれ、常に最適解は現役エンジニアによって書き換わっています。
現役エンジニアですら致命的エラーを修正すればアプリ公開する中、初心者が最適解を目指すのはやめましょう。
プログラミング言語の基礎学習が難しい
次に考えられるプログラミング学習の難しさは、言語の基礎学習についてです。
- そもそもプログラミング言語の基礎学習が難しい
- 言語の基礎学習における基準がわからない
- 何をもって理解したと判断するべきか
ここでは、学習対象であるプログラミングそのものについて言及していきます。
そもそもプログラミング言語の基礎学習が難しい
プログラミング未経験であれば、そもそもプログラミング言語の基礎学習が難しいです。
当たり前ですが、自身で取り組んだ経験がないものはどんな時も簡単ではないです。
ましてや、英語による記法がスタンダードで文法上のルールや構文など触れてきたことがない人は難しいです。
筆者も例外なく苦難しながら大学4年間でプログラミング基礎を学び、少しだけ利用できるかなと思っている状態です。
後述する内容が絡みますが、基礎学習においても学習内容を絞った形で進めることをおすすめします。
言語の基礎学習における基準がわからない
とはいえ、特定の言語基礎学習においてプログラミング初心者は学習範囲と基準が分かりません。
ここで、重要になるのが目的逆算思考からなる学習範囲と基準です。
- Pythonの環境構築
- Pythonの基礎(変数/定数/文字列/数値など)
- データ構造(リスト/タプル/辞書/集合)
- 制御フロー(if/for/while/関数など)
- モジュールとパッケージの使い方
- オブジェクトとクラス
- ファイル操作
- コードスタイル
- コンフィグとロギング
- データベース連携
- Web/ネットワーク連携
- テストコードの記述方法
- マルチスレッドとマルチプロセス
- 暗号化
- インフラ自動化
- 便利なライブラリやツール
- 非同期処理
基礎学習といえど、Pythonを例にしても学習範囲を制限しないと終わりが定めにくいほど取り組みたい内容が発生します。
また、Python以外のエコシステム連携も含まれてくるため、特に独学でロードマップを敷く際は注意が必要です。
例えば、以下の関連記事に記載のようなToDoアプリから開発すると仮定します。
簡易的なアプリ開発を実施すると分かりますが、Pythonのみ技術を抽出するとシンプルな内容になります。
- Pythonの環境構築
- Pythonの基礎(変数/定数/文字列/数値など)
- データ構造(リスト/タプル/辞書/集合)
- 制御フロー(if/for/while/関数など)
- モジュールとパッケージの使い方
- オブジェクトとクラス
初期に高度な技術に踏み込まない限り、基礎学習は短期間で終わります。
また、詳細は後述しますが開発時に利用するライブラリやフレームワーク特有の構文も加わるため、アプリ開発しないと知ることがない構文も数多く出現します。
そのため、完璧な基礎学習に囚われず、開発段階で必要な基礎内容が出現したら戻って学習することも一定存在すると考えてよいです。
何をもって理解したと判断するべきか
結論は、「一概に理解したと判断できない」が答えになります。
元も子もないですが、一部の使い方を理解したからといって未知の問題が高難度あるいは複雑であれば、解決できるか別問題になります。
つまり、理解度の深さと自走経験によってエンジニアによってもエラー対処や問題解決できるか左右されます。
学生時代でも数学の定理を用いた基礎問題は解けても、応用問題になった途端解けない人はいたと思います。
要求される問題が難しい場合、エンジニアであっても誰もが解決できるわけじゃないと考えます。
そのため、難易度が高い問題に初期から取り組んでいる人はプログラミングが難しいと感じるでしょう。
どうやってアプリ開発するかわからない
次に考えられるプログラミング学習の難しさは、基礎内容とアプリ開発時のギャップです。
- ライブラリ/パッケージ/フレームワークといった新たな概念
- 基礎内容と開発内容が大きく異なり困惑する
- アプリ開発で必要なインフラ知識やエコシステム
特に、アプリ開発時の膨大な情報量に圧倒されてしまう人は「難しさ」に直面します。
フレームワーク/ライブラリ/パッケージといった新たな概念
アプリ開発を始めると、フレームワークやライブラリ・パッケージなど多用することになります。
また、図解がないと立ち位置が分からず理解しづらいです。
そのため、フレームワークやライブラリ特有の構文も出現し、途端に調べる情報量が増えて学習難易度が上がります。
フレームワークとは
フレームワークは、アプリケーション開発において全体の枠組みを決める機能を持ちます。
そのため、フレームワークは「枠組みを決める」、ライブラリは「機能を実現させる」ものとして目的から役割を分かちます。
ここでは、例としてPythonの代表的なフレームワークを記載します。
フレームワーク | 公式サイト | 初回リリース時期 |
---|---|---|
Flask(フラスク/フラスコ) | https://palletsprojects.com/p/flask/ | 2010年 |
Django(ジャンゴ) | https://www.djangoproject.com/ | 2005年 |
Bottle(ボトル) | https://bottlepy.org/docs/dev/ | 2009年 |
FastAPI(ファストエーピーアイ) | https://fastapi.tiangolo.com/ | 2018年 |
ライブラリとは
ライブラリは、複数のパッケージから成り立っています。
注意点として、標準ライブラリとがぶライブラリがあります。
例えば、Pythonインストール時点で同梱されるライブラリは標準ライブラリになります。
また、Numpyやpandas/seleniumなど別個インストールするものは外部ライブラリにあたります。
パッケージとは
端的に言えば、モジュール(.pyファイル)を複数集めたものを指します。
要は、.pyファイルが複数あるフォルダの認識で問題ありません。
モジュールとは
例としてPythonで記載すると、Pythonのファイル(.py)を指します。
Import文でxxx.pyをインポートすることでxxx.pyの中の関数やクラスを使用することができます。
また、モジュールは他のプラグラムから呼ばれて使われることを前提に書かれています。
中身はシンプルにクラスや関数が定義されているファイルと認識して問題ないです。
このように、基礎学習の難しさは氷山の一角に過ぎず、アプリ開発の段階で挫折する人も一定数存在します。
基礎内容と開発内容が大きく異なり困惑する
上述した通り、フレームワークやライブラリの出現によって学習量は増加します。
また、各フレームワークやライブラリの構文がアプリ開発で一定出現するので、基礎学習で学んだコードと異なる(特に関数やメソッド)点に困惑するでしょう。
あくまで、オブジェクト指向の考え方や各プログラミング言語特有の記述方式を身に付けたら基礎学習は終えてよいと考えます。
なぜなら、アプリ開発による学習でしか得られない考え方や特有の技術/概念を身に付けなければならないからです。
さらに、基礎学習に囚われ時間を奪われると、本来必要なかった重箱の隅にある技術も網羅的に実施する可能性があるためです。
最低限の学習→簡単なアプリ開発→必要になった基礎学習やライブラリ学習といった往復によって、少しずつ学習範囲を開発と並行して拡大しましょう。
要は、わからない度に戻って分からなかった箇所だけつまみ食いすればよいです。
アプリ開発で必要なインフラ知識やエコシステム
アプリケーション開発は、アプリを中心にした開発環境だけにとどまりません。
例えば、Webアプリ開発であればインフラ環境に関する知識やその他エコシステムもスキル習得する必要があります。
オンプレミスとは
オンプレミスは、自社で設備を保有して各環境を構築・運用する形態を表す言葉として用いられます。
オンプレミスでも仮想化ソフトウェアを用いることにより、IaaSと同様に仮想マシンを利用することができます。
オンプレミスではサーバーマシンなどの選定の自由度が高い反面、ハードウェアや設備、さらには建物など自社で管理が必要な範囲が広いため、IaaSと比べて運用や保守に要する負荷が増大します。
IaaSとは
IaaSは”Infrastructure as a Service”の略記であり、日本語では「サービスとしてのインフラストラクチャ」と直訳されます。
IaaSは主にデベロッパー向けに仮想マシンを提供するクラウドサービスの形態を意味する言葉として用いられ、IaaSのサービスで提供される仮想マシンにはLinuxやWindows Serverをはじめとして様々なOSを選択することができます。
PaaSとは
PaaSは”Platform as a Service”の略記であり、日本語では「サービスとしてのプラットフォーム」と直訳されます。
PaaSは主にデベロッパー向けにアプリケーションソフトウェアの実行環境やサーバーソフトウェアを提供するクラウドサービスの形態を意味する言葉として用いられます。
SaaSとは
SaaSは”Software as a Service”の略記であり、日本語では「サービスとしてのソフトウェア」と直訳されます。
SaaSは主にエンドユーザー向けにアプリケーションソフトウェアをネットワーク経由で提供するクラウドサービスの形態を意味する言葉として用いられます。
一般的に、アプリケーションエンジニアであってもクラウド環境を提供する代表的なサービスであるAWS/GCP/Azureなどは必須の知識になっています。
他にも、パッケージマネージャーやGitHubなど各種ツールも並行に学習するタイミングが訪れると、途端にプログラミングが難しい(正確には環境だが)と感じてしまいます。
これらはアプリ開発の段階に踏み込まないと触れることがないため、永遠に基礎学習を続けないために切り上げる基準を設けておきましょう。
プログラミングの学習環境整備は難しい
上述したように、プログラミング未経験あるいは初心者にとってあまりにも必要な学習量は膨大になります。
例えば、純粋なプログラミング学習以外に考えなければならない項目もあります。
- 学習によって実現したい目的/目標設定
- 学習内容の取り決め
- 学習レベルの基準
- 学習時間の確保
- 学習計画の具体的なスケジュール管理
- プログラミングにおける悩み/エラー解消などの学習環境
- エンジニア就職/転職の具体的な実現方法
要するに、目的達成するためには純粋なプログラミング学習のみとはいかず、学習計画に脳みその思考を奪われてしまいます。
仕事や生活と並行してプログラミングスキルを習得したい人にとって、純粋なプログラミング学習以外の時間は短縮したいはずです。
独学によるプログラミング学習の難しさを詳細に知りたい人は「【プログラミング独学】初心者はやめとけと言われる理由と唯一の解決策」を一読ください。
プログラミング学習で「やらないこと」を決める
結論は、プログラミング学習で「やらないこと」を決めましょう。
ただでさえ、プログラミング学習は前述した通り純粋なプログラミング知識に限らず様々な観点で膨大な学習量を求められます。
- 学ぶべきこと
- 学びたいこと
- 学べること
個人的な見解ですが、プログラミング初心者は目的/目標が不明瞭の場合に無駄な学習を取り組んでいるケースが見受けられます。
- 学ぶべきことで、学びたくて、学べること
- 学ぶべきことで、学びたいこと
- 学びたいことだが、学ぶ必要がないこと
- 学びたくて、学べることだが、学ぶ必要がないこと
- 学べることだが、学ぶ必要がないこと
- 学ぶべきことで、学べること
- 純粋に学ぶべきこと
7分類に分けてしまいましたが、要は「学ぶべきこと」を念頭に学習の優先度を付けるのがよいです。
自身の目的/目標に沿ったプログラミング学習をほんとに取り組めているのか改めて確認しましょう。
基礎学習の理解基準を設けたい人は「【プログラミング独学】無理な状態なら目的逆算思考で考える」を一読ください。
独学によるプログラミング学習は無理なのか
当然ながら、「独学ではもう無理。」と挫折や諦めを抱いて手を止めてしまった人は、今後のプログラミング学習は無理でしょう。
ただ、一度これまでのプログラミング学習を振り返り、独学によるプログラミング学習は無理なのか判断しても良いと思います。
- 思い通りの学習ができていない
- 未知の問題が解決できない
独学によるプログラミングの悩みを大別すると、上記のパターンに分けられると考えています。
プログラミングが難しいと感じたのは事実だとしても、時間さえかけたら可能性があったり、未知の問題の取り組み方が分かれば変わるケースもあります。
プログラミング学習が難しいと感じる人は一つの考え方として「【プログラミング独学】無理な状態なら目的逆算思考で考える」を一読ください。
コメント