プログラミングを学び始めた人の中で、学習でプログラミングが定着せず伸び悩む人がいます。
|
これらの悩みを解決しながら、プログラミング脳や考え方を解説します。
結論から言うと、これはプログラムのコピペを多用していること、プログラムに対して思考停止してることが原因で引き起こされます。
筆者はこれまでIT企業で独自アプリ開発の経験や、個人のプログラミングスクール支援、本ブログによるプログラミング学習サイトを運営してきました。
そのため、様々な知見と経験からある程度の信頼性を担保できる内容だと思っています。
ここでは、コピペを多用することによる注意点からプログラミング学習での考え方まで進めていきます。
記事を読み終えた時に、プログラミングの学び方と取り組む姿勢が変わるはずです。
最終的に、今のあなたに足りない行動や足りてない学習方法が見つかるので、次のアクションプランが明確に理解できます。
目次
コピペする人の特徴は会話すれば分かる
コピペしてしまう人の特徴は、作成したプログラムを説明できないことです。
プログラムを理解して作成しているかしていないかはっきり分かれます。
言語化に慣れていない初心者の人もいてうまく説明できないこともありますが、コピペした人はそれ以上に説明できないのですぐに分かります。
プログラミングの学習内容を暗記する形で覚えようとする人に多いです。
つまり、考えることを諦めている人です。
プログラミングは理解に努めたかどうかも大切です。
動いたことをいいことに、理解を放ったらかしにしている人はいつまで経っても上達しません。
プログラミング学習のステップアップを考えている人であれば、絶対に理解を深めていきましょう。
頭が悪い・理解できていないコピペプラグラマーの特徴
思考停止や理解が及ばないコピペプログラマーの特徴は以下の4つです。
改めて具体的に書き出すと、問題点が見えてきます。
|
そもそも頭が悪いとあまり表現として美しくない言葉を利用していますが、実際には決して取り組んでいる人の頭が悪いということではありません。
プログラミング未経験で右も左もわからない状態であれば、自然とコピペプログラマーに陥りやすい状況が多くあることが問題です。
具体的に、どのような弊害をもたらすのか解説します。
解答探しによる思考停止
特に、オンラインスクール卒業生などに多いのが解答探しによる思考停止です。
提供されるサービスや無料相談などですぐに解決策を求めてしまうと、むしろエンジニアとしての能力は育ちません。
残念ながら、エンジニア業務は検証と実装の繰り返しであるため、都度解答探しをするタイミングもサポートセンターもありません。
そのため、自力で解決する術を身につける必要があります。
学習教材を理解し切れていない
端的に言えば、パターン認識でしかプログラムを実装できなくなります。
初めて取り組む内容に対して、全くプログラミング学習が役立つことがありません。
「〇〇ができる!」「××の作成方法を知った!」というのは結果論です。
プログラミングは、〇〇や××といった結果を求めるための過程も重要視されます。
つまり、過程を理解しなければ別プログラムへ応用できません。
トライアンドエラーができない
解答探しによる思考停止へ繋がる内容として、トライアンドエラーに取り組めないことも問題視されます。
プログラミング業務では初めて取り組む内容が膨大にあるため、検証できる忍耐力がなければ続きません。
検証コードだけで終わる1日が存在したり、エラー解消で終わる1日も存在します。
わからない時こそどのように問題解決するか思考/試行できるエンジニアリングが求められます。
開発意欲がそもそもない
プログラミング業務は、新しい技術・サービスに触れることが多いです。
そのため、最新技術・サービスを駆使したり、新しい言語開発などを実務で取り組むことはよくあります。
エンジニアとして好奇心旺盛・知識欲をある程度兼ね備えておく必要があります。
知識・技術に対する前向きな姿勢がないと継続した学習と業務をこなすことができません。
コピペは100%悪と言えるのか?
理解していない類似コード群がプログラム内に散在化してしまい、保守性を下げてしまったり、共有のしづらさを発生させてしまいます。
しかし、全てが悪いわけではありません。
プログラミングにおける文法等を全て覚えることは困難ですし、おそらく取り組んでいるプログラミング言語や利用するプログラミング言語によってライブラリも膨大に存在します。
そのため、覚えきることができなかった文法やライブラリの使い方に対してサンプルコードをコピペすることは問題ないと思います。
どれだけベテランな人でも変わらないです。
コピペしてステップアップができない人とステップアップしながらプログラミングに取り組み続けられる人の違いは、プログラム内にコードを貼り付ける理由や意味を持って利用できているかどうかになります。
プログラムの過程を理解した上で、使用方法やその表現をコピペしているかどうかです。
理解している上でコードを使用しているならば、たとえ中身をあとまわしにしたところで、使用方法に関して応用することができますし、プログラムに対してリファクタリングできますし、不具合・エラー等も解決できるはずです。
動けばよしと考えるのは、あくまでも自分自身で扱うプログラムまでですし、他者が利用することを考えたり、ましてやプログラミングで稼ぐということは、理解ある状態が非常に大切なことになるわけです。
コピペはパターン認識に陥ってしまう原因になる
ここで問題視しなければならないことは、コピペだけを駆使してプログラムを作成する人でも、選択したプログラミング言語とフレームワークを利用すれば、ネット上の多くの情報によってパターン認識で動作するアプリやプログラムを作成できてしまうことです。
もちろん、個人だけで完結するプログラムであれば何も問題はありません。
しかし、チームで開発したり、他者と共有しながらコードレビューを行う際に、コピペを利用したパターン認識のプログラムだと非常に周りは苦労を伴ってしまうことになります。
つまり、意図が読めないコードが散在化することで、共有することができないコード群になってしまうわけです。
変数名、関数、クラス、ループ処理の有無、存在する機能の分割など、意図したコードでないからこそ本人すらも理解できていないということなので、共有された側もコードの意味を汲み取ることは困難になります。
理解していなくても動作してしまうことから、内部改善するためにリファクタリングするにも中途半端な判断をさせられてしまうのです。
いっそ0から作り直す方がシンプルなものになってしまうため、手を出しにくいものを残したコード群が完成してしまいます。
もちろん、パターン認識による弊害はこれだけにとどまらないです。
一番残酷なのは、与えられたものでしかプログラムを作成できなくなってしまうことです。
課題創造型のプログラミング業務であれば、間違いなく何が課題となり得るのかわからない状況に陥ります。
また、すでにある課題に対して解決まで導く課題解決型のプログラミング業務であっても、ググるといった検索行為や参考となるものがなければ、太刀打ちできない状況を招いてしまうことになります。
それほどまでにコピペにはパターン認識という危険な要素が存在していることになります。
なぜコピペを多用してしまうのか?
一般的に考えれば、作業効率を上げるためにすでに動作するコードがあるなら利用したいに決まってます。
また、コンピュータは正しいプログラム(指示書)でなければ読み込み、動作することができません。
つまり、動くものを想定できなければコードにしても結果を得られないわけです。
このような状況だと、プログラミング初心者にとって学習が苦痛になってしまうことがあります。
そして、挫折という苦い経験になってしまうのですが、すでにできているプログラムをコピペすることでそれを解消することができます。
利用できたタイミングで理解のステップに移行せず、次のプログラムに作業を移してしまうことが原因として考えられると思います。
そして、類似プログラムが出現した際に、パターン認識として覚えていたコードをまた引っ張り出し、理解していないが動作してしまうプログラムを量産してしまうループに入ります。
正直、パターン認識でプログラムを作れてしまうことは、PCさえ使えればプログラミング未経験者であっても可能なため、プログラミングを学び理解しているとは言い難いものになります。
もしプログラミングを継続して取り組んでいきたいと考えている人であれば、間違いなくプログラミングに対する考え方を見つめ直すタイミングが訪れます。
コピペは非常に楽ですが、必ずそのツケが回ってくるので、プログラムの理解に時間を費やしていきましょう。
プログラミング脳の鍛え方・考え方のコツ
実際にプログラミング脳を鍛えたい人であっても、取り組み方がわからない場合がほとんどです。
ここでは、実践的なプログラミング脳の鍛え方・考え方のコツについて2つ紹介します。
|
これら2つのコツを身につけると、プログラミング脳が鍛えられます。
特にイメージだけで終わらせてしまうと具体的な設計ができていないため、コードの実装段階にいつまでも辿り着けないので注意しましょう。
プログラムの仕様を考える機会を設ける
普段何気なく利用しているサービス/アプリに対してどのような仕様が含まれているか考えることです。
押さえておきたいポイントは以下の3つです。
|
例えば、SNSであるTwitterはフォロー機能とアンフォロー機能があります。
フォロー機能は、特定のユーザーに対してフォローボタンを押すとフォローします。
この際、自身のアカウントはフォロー数が増加し、特定ユーザーのフォロワー数が増加します。
この時、データベース上では特定ユーザーのフォロワーカウントアップとアクション側ユーザー(自分)のフォローカウントアップが発生します。
一方で、アンフォロー機能はフォロー機能の逆を実行しますが、数字を切り替えるだけでサーバーサイドの処理工程はかなり類似するはずです。
このように、違う機能であってもコードの流れとして類似箇所があると想定できます。
プログラムの仕様を考えることで、プログラム設計は始まります。
プログラム/システムに対するフローチャートを想定する
プログラムの仕様を考える癖が身に付くと、具体的な処理工程を想定する必要があります。
アルゴリズム構造とも呼ばれますが、難しく考える必要はありません。
基本的に以下の3つを把握/理解しておけば、複雑なアルゴリズムであっても読み解けるようになります。
|
順次は問題ないと思いますが、条件分岐や繰り返しはif文/for文/while文などをイメージできればOKです。
上記は、簡易的なUber Eatsと簡易的なマッチングアプリの2つをイメージしてフローチャートを作成しています。
当然、一部のユーザー行動に対して特定の処理工程を考えているため、設計不足は否めませんがイメージしやすくなります。
想定しやすいのがユーザー側の行動であるため、ユーザー側の行動→システム側の処理工程のように考えると設計しやすいです。
また、フローチャートを作成するとスモールで開発する際の最小限の機能が可視化しやすいです。
スモール開発を想定して可視化された機能がまとまった段階で、各機能に必要なクラス/モジュール、関数/メソッドを詳細に設計できるようになります。
プログラミングにおけるロジックの考え方
ここで重要なのは、プログラミングにおけるロジックの考え方です。
|
上記のような悩みでコードを記述できないプログラミング初心者はたくさんいます。
そのため、おすすめするのが疑似コードプログラミングプロセス(Pseudocode Programming Process: PPP)になります。
特定のプログラミング言語実装に縛らず日本語で一度記述することで、実装の品質を高めるテクニックです。
疑似コードプログラミングプロセスのメリット
疑似コードプログラミングプロセス(PPP)のメリットは以下になります。
|
これらの項目が主なメリットになります。
設計段階からコード追加/修正がロジックからわかる
結論として、プログラミングは設計を繰り返して最終的なコード実装にたどり着きます。
|
多くのプログラミング初心者は、写経するにしてもオリジナルで記述するにしても、いきなりコード実装に取り掛かる傾向があります。
しかしPPPから始めない場合、特に1/3/4番の設計段階にて頭の中のイメージを抽象的に持つだけで、具体化/言語化できておらず実装途中で変更/修正が多くなると思います。
PPPの最大のメリットは、実装前に言語化することで設計段階から変更が容易という心理的障壁の解消です。
プログラミングコード内に有益なコメントが残る
2つ目のメリットは、コード内に適切で有益なコメントが残ることです。
基本的に粒度を深めれば、実装したコードと1対1の関係で疑似コードを残せるため、個人であってもチーム開発であっても読者に分かりやすい言語化した機能を伝えることができます。
また、疑似コードで残したコメント自体がアプリケーションの仕様書になる可能性もあるため、アプリ仕様書/設計書/GitHub上のreadme.txtなどに再利用できます。
プログラミングの考えるべき優先順位と粒度を適切に分割できる
3つ目のメリットは、プログラムに対して影響度が高い箇所から設計/改善できる点です。
|
改めて上記の項目を確認すると2/3/4番の順番に対して、いきなり実装してしまうとコーディング作業に後戻りを発生させる原因になります。
例えば、1番の要件整理(変数定義や初期イメージのクラス/モジュール単位)したのちに、5番の実装に入ってしまうと開発途中でメソッド/関数の追加するケースが頻繁に発生します。
その際に、一度要件整理し記述したメソッド/関数の内部設計やクラス/モジュールの内部設計に影響を及ぼし、最悪の場合は要件整理まで後戻りするハメになります。
予め疑似コードプログラミングプロセスを実行することで、上記の事態を防ぐ役割があります。
プログラミングの考え方を身に付ける5つのステップ
では、具体的にプログラミングの考え方をどのように身につけていけば良いのか解説していきます。
また、プログラミングにおいて様々な概念が存在することから、一概にここで解説する内容が正しく共通するものではありません。
ですが、プログラミング初心者にとって初歩的なプログラミング脳を構築してもらうために、単純化を図った過程を順序立てて説明していきます。
|
これらを取り組みの中に組み込むだけで、初歩的なプログラミング脳を会得し始めることができるはずです。
さらに詳しく一つ一つを解説していきたいと思います。
作成するプログラムの仕様を把握・理解
当然のことですが、プログラムは何か結果を得るために作成されます。
必ずそのプログラムに意図が存在します。
そのため、作成するプログラムはどんな仕様なのか把握し、理解することから始まります。
つまり、そのプログラムに関しての要件を満たすために、必要とされる要求事項の集まりを把握・理解します。
上記の章で解説した『プログラムの仕様を考える機会を設ける』ことで、自身の開発したい制作物の目的/要件定義を考えてみましょう。
確認フェーズを設ける
ここでは、必要に応じてプログラムが正しく動作するか確認する箇所や想定をあらかじめ設けることになります。
上記の章で解説した『プログラム/システムに対するフローチャートを想定する』部分に該当します。
開発するアプリケーションに対して設計できると、スムーズに実装段階へ移行できます。
また、事前に設計することで改善/検証/拡張箇所の把握、プロダクト開発時の後戻り発生を事前に防ぐこともできます。
プログラムの工程を考える
ここでようやく目的となるプログラムに対して、細分化した工程を考えていきます。
どのような流れでプログラムの目的を達成させるか考慮していくわけです。
上記の章で解説した『プログラミングにおけるロジックの考え方』が重要になります。
フローチャートと違い、ここから実装する前の具体的なコードプロセスを考えるため、疑似コードプログラミングプロセス(PPP)を利用すると良いです。
コーディング開始
選択したプログラミング言語の記述ルールに従って、コーディングを開始していきます。
小さいプログラムから始まり、拡張性を考えながらさらなるコーディングを書き加えていきます。
このように、プログラミング脳を鍛えていくためにはプログラムの工程を考えたのちにコーディングする癖をつけていきましょう。
リファクタリング(コードの内部改善)
最後に、コードの改善を図っていきます。
コード短縮や効率的な機能追加など、プログラムのアップデートを考えていきます。
しかし、多くの人の場合いきなりここまでの順序を当たり前のように取り組むことができません。
筆者自身も例外ではなく、始めからこのようなプログラミングの考え方を行うことはできませんでした。
だからこそ既存のプログラムを利用するわけですが、理解を深めるフェーズをしっかり設けること、ロジックを考えることがプログラミング脳を養っていく訓練になります。
プログラムが動作しなくても再検索するべきではない
コードを手軽に入手するために多くのプログラミング初心者がGoogle検索を多用します。
検索行為自体は問題ありませんが、利用価値がないコードだとしても以下の内容を検討した上で再検索を行いましょう。
|
コード全体を把握した上で利用価値があるのか判断するためには、自身が完成させたいプログラムとの比較が必要です。
また、一部分だけ利用できるコードを探している場合でも、自身のプログラムの全体像を理解する必要があります。
つまり、検索結果で見つかったコード群そのものが使えるものなのか、一部分使えるコードなのかで再検索時の検索ワードを細分化する必要があります。
常に、自身が作成するプログラムを抽象的ではなく、具体的で必要な要素を把握しながら検索しましょう。
コピペではなく、写経をする
初学者の捉え方によっては、車輪の再発明のように感じて効率的ではないし、それこそコピペでいいじゃないかと思われるかもしれません。
しかし、大切なのはプログラミング脳を鍛えて、プログラミングの考え方を身に付けることにあります。
効率化を図るのは、プログラミングを理解できているからこそ始まっていきます。
パターン認識に陥ってしまうコピペの多用は、残念ながら本人の成長には繋がりません。
プログラミング初心者の学習方法をまとめているものや写経の効果を詳しく解説している記事がありますので、そちらも合わせて参考にして頂ければと思います。
Pythonロードマップを元に本格的な学習を始めたい人へ
おそらくプログラミング未経験からPythonあるいはプログラミング活用を図りたい人は、以下の考えが存在すると思います。
|
上記の悩みや課題をPythonロードマップとして言語学習から転職までを目標プロセスに落とし込んで作成しました。
あなたの考えるエンジニア像のゴールに合わせたオンラインプログラミングスクールが選べる情報も公開しているので、一度読んでみてください。
まとめ
ここまで、コピペに関する見解やプログラムを作成するにあたっての具体的な解説を行なってきました。
おそらく、継続してプログラミング学習を行う人にとって、コーディングによるエラーや課題への取り組みは、膨大に出現すると思います。
その中で、プログラムの工程を言語化できるようになることが大切です。
プログラムは何を行なっているのか、それぞれのコードによる機能はどんなものか、機能はどんな働きをしているかなど、言葉にできているかできていないかで理解の深まり方は大きく変化し、プログラミングへの成長に関してステップアップしていくことができます。
あなたのプログラミング学習において、課題創造するにしても、目の前の課題解決にしても、必ずこういったプログラミングの考え方は役に立ってきます。
最後まで一読していただき、ありがとうございました。