ひとえにプログラミング学習といっても、言語学習にとどまらずITインフラ全体が関わり膨大な学習内容が待ち受けています。
しかし、プログラミング学習の第一歩は言語における基礎学習になります。
本記事では、以下の内容を記載しています。
- プログラミングの考え方
- プログラミングの考え方を体系化する
- プログラミング脳を鍛える
- プログラミングが上達しない人の特徴
- プログラミングの考え方を身に付ける5ステップ
次章から詳細に解説していきます。
プログラミングの考え方
「プログラミングの考え方」と聞いて、頭の中で体系化できる人はどれほどいるでしょうか。
特に、プログラミング初学者はプログラミングに興味関心を持ったタイミングで、ネット情報から確認する人も少なくありません。
ネット情報が膨大なため、様々なプログラミングの考え方を提示されて情報整理ができず、「ほんとに正しく取り組めているのか?」とモヤモヤを抱えて学習する人もいると思います。
簡単に情報が手に入る時代だからこそ、情報整理と情報精査の重要性を増し、「プログラミングの考え方=プログラミングの本質」を捉える必要があります。
プログラミングの考え方を体系化する
プログラミングにおいて、いきなりWebアプリ/サービスを開発する人は少ないと思いますが、それでも何から手を付ければよいかわからない人も少なくないです。
当たり前ですが、プログラミング言語における基礎学習が最初の一歩になります。
- 変数
- 定数
- 演算子
- 配列
- オブジェクト指向
- 関数
- 条件分岐
- ループ
- クラス
- その他言語特有の機能など
選んだ言語によって特有の機能や概念が存在しますが、共通点として上記の項目が当てはまるかと思います。
そのため、言語特有のコードの記述差異があれど、上記の基礎項目が大きくずれることはありません。
これらを駆使することでWebアプリ/サービスの根幹であるプログラムが構成されています。
基礎固めを終えていないのに、プログラミング脳を鍛えるのは「鍛える以前」の問題です。
まず、取り組むプログラミング言語をしっかりと習得しましょう。
プログラミング思考について
プログラミング思考を養うことは、プログラミングに限らず大きなメリットがあります。
ここでは、プログラミング思考の重要性を解説します。
プログラミング思考とは
そもそもプログラミング思考とは、プログラム作成あるいはアルゴリズムを構成するための思考です。
特定の未知な課題に対して、必要となる解決要素を順序立てて構成し、求める結果まで導く思考になります。
そのため、プログラミングに限らず既存ツールやサービスも駆使しながら最適な手段を見つけ出し、最良の結果を目指すことになります。
いわゆるロジカルシンキング(論理的思考)の一部としてプログラミング思考が存在します。
どちらも最適な手段で目的達成する意味としては両者に違いはなく、共通する考え方が多いです。
端的に言えば、直感や感覚ではなく論理に基づいて物事を理解し筋道を立てて考える思考法が論理的思考であり、論理立てて構成したアルゴリズムをプログラムに落とし込むまでがプログラミング思考になります。
プログラミング思考が重要な理由
円滑な課題解決を実現するには、むやみやたらに取り組んでも失敗に終わるケースが多いです。
特に、複雑なプログラムや規模が大きいプログラムになるほど、単純に非論理的思考で取り組むと無下に終わります。
プログラミング思考で言えば、プログラムの出力結果を明らかにし、最終目的逆算思考で手段を選択する必要があります。
そのため、プログラミングから枠を広げても有用な思考法になります。
ネット情報が溢れている中で、プログラミング思考は日常生活・担当業務等の改善に役立ちます。
無作為に情報の取捨選択をするのではなく、物事を順序立てて無駄を省いたクリティカルな情報のみ収集しましょう。
つまり、自身の周りで役立つ情報を見極める力が重要になります。
プログラミング思考を伸ばすには
とはいえ、論理的思考に基づいて課題解決するアルゴリズムを構築したのち、プログラムに落とし込み実用的な状況を作る必要があります。
Excel・スプレッドシート・スクリプトファイルなど、課題解決の手段はいくつもあります。
そのため、「最終的な目的である出力結果」「どのようなプロセスを踏むか」「各プロセスで何を利用するか」といった逆算思考で課題を解決します。
- 課題解決に向けた情報収集が身につく
- 課題を解決する最適なアルゴリズムを導く
上記のように、プログラミング思考によって情報収集力と課題解決力が身に付きます。
プログラミング脳を鍛える
当然ながら、プログラミング脳を鍛えるためには、弛まぬコーディングの繰り返しが必須になります。
- プログラミングにおけるロジックが思いつかない
- プログラミングにおけるロジックの考え方がわからない
- プログラミングロジックの鍛え方がわからない
上記の悩みを思うようにコードを記述できない初学者がたくさんいます。
そのため、始めからコードを記述するのではなく、前段階の作業を意識します。
それが、「疑似コードプログラミングプロセス(Pseudocode Programming Process: PPP)」になります。
プログラミング言語のコード実装から始めず日本語で一度記述することで、実装の品質を高めるテクニックです。
疑似コードプログラミングプロセス(PPP)のメリット
疑似コードプログラミングプロセス(PPP)のメリットは以下になります。
- 設計段階でコード追加/修正がロジックからわかる
- プログラムコード内に有益なコメントが残る
- プログラムの考えるべき優先順位と粒度を分割できる
設計段階でコード追加/修正がロジックからわかる
プログラミングは設計を繰り返して最終的なコード実装にたどり着きます。
- 要件の整理
- クラス/モジュールの設計
- クラス/モジュールの内部設計
- メソッド/関数の内部設計
- 実装開始
多くのプログラミング初学者は写経やコピペ、オリジナルの記述に限らずいきなりコードを実装してしまいます。
上記は難しく書いていますが、要は要件整理から自身が考えるプログラムを言語化しましょうと記載しています。
PPPの最大のメリットは、実装前に言語化することで設計段階から変更が容易という心理的障壁の解消です。
プログラムコード内に有益なコメントが残る
次のメリットは、コード内に「有益なコメントが残ること」です。
基本的に粒度を深めれば、実装したコードと1対1の関係で疑似コードを残せる(1コードごとに処理内容を記述できる)ため、個人であってもチーム開発であっても読み手に分かりやすい言語化した機能を伝えられます。
また、疑似コードで残したコメント自体がアプリケーションの仕様書になる可能性もあるため、アプリ仕様書/設計書/GitHub上のreadme.txtなどに再利用できます。
プログラムの考えるべき優先順位と粒度を分割できる
最後のメリットは、「プログラムに対して影響度が高い箇所から設計/改善できる点」です。
- 要件の整理
- クラス/モジュールの設計
- クラス/モジュールの内部設計
- メソッド/関数の内部設計
- 実装開始
改めて上記の項目を確認すると2/3/4番の順番に対して、いきなり実装するとコーディング作業に後戻りを発生させる原因になります。
初学者の場合、実際に考えたプログラムの要件に沿って利用できるライブラリや作成方法があるか確認しないまま実装し始め、「作れなかった」ケースが頻発します。
予め疑似コードプログラミングプロセスを実行することで、上記の事態を防ぐ役割があります。
プログラミングが上達しない人の特徴
プログラミングが上達しない人の特徴は、主に2つあります。
- 回答探しに奔走する
- コピペを多用する
上記はプログラミング初学者が長期的な学習を挫折する原因になるため、注意が必要です。
回答探しに奔走する
現役エンジニアですら、検索による情報収集によってプログラムの課題を解決するのは当たり前です。
ただし、「何を検索すべきか」「解決方法はどんなものがあるか」、事前に想定しながら経験を積みます。
すぐに課題解決できるエンジニアを目指すためには、言語化がどれだけできるかに起因します。
また、プログラムの要件を把握・理解しているからこそ、課題が発生した時の対処も焦ることがありません。
闇雲な回答探しほど上達が遅れてしまうため、”当たり”を付けて実施できるように経験を積みましょう。
コピペを多用する
コピペは決して悪いわけではありません。
ただし、エンジニアは必ず処理内容を理解し利用しています。
ネット情報の出典先では問題なく実行できていてもあなたの環境で動くとは限らず、エラーが発生することは多々あります。
その際に、プログラムの仕様も分からずコピペをするといったパターン化が起きてしまい、結局考える力が養われません。
最悪の場合、コピペして動くプログラム以外は作れなくなる初心者で終わってしまいます。
プログラミングの考え方を身に付ける5ステップ
具体的にどのような考え方でプログラムを実現するのかは、以下の5ステップを意識しましょう。
- プログラムの仕様策定
- プログラムの仕様確認
- プログラムの工程確認
- コーディング開始
- リファクタリング
実際、プログラム一つに対して現役エンジニアが常に上記を考えることはありません。
しかし、どんなエンジニアも初学者だった頃は試行錯誤が多く、経験も全くないためトライ&エラーばかりだったはずです。
頭の中で省略は行えど、経験を積み重ねエンジニアとしての”勘”を養っていくしかありません。
プログラムの仕様策定
当たり前ですが、プログラムは結果を得るために実装します。
つまり、必ずあなたが考えるプログラムに意図が存在します。
そのため、実装するプログラムはどんな仕様なのか把握・理解する必要があります。
プログラムの仕様確認
プログラムの仕様が決まった段階で、確認も実施していきます。
例えば、プログラミング言語Pythonによるスクレイピングプログラムを実装するとしましょう。
・スクレイピング技術に対して必要なライブラリは何か
・スクレイピング時に必要な変数は何か
・スクレイピングの関数はどのような実装方法があるか
・スクレイピング対象のサイトはそもそもスクレイピング可能か
プログラムの仕様を取り決めつつも、実現可能か考える必要があります。
プログラムの工程確認
実際に、プログラムの工程を考える必要があります。
上記の例のまま、スクレイピングプログラムで考えると、スクレイピングまでの動作を確認するとよいでしょう。
- スクレイピング対象サイトへのアクセス
- サイト内でのデータ収集
- スクレイピングデータの書き込み
- データファイルの出力
ここでは、プログラムを実装することで何が実現できているか確認しています。
コーディング開始
ようやく、プログラムの仕様で確認した必要なライブラリや関数処理、それらを利用したプログラム全体の動きが見えてきたのでコーディング開始です。
- スクレイピングで利用するライブラリのインポート
- スクレイピング時にデータを置き換える各変数の定義
- 対象サイトへのアクセス時に操作したい処理をまとめた関数
- アクセス時の処理で取得したデータを出力に合わせてデータ整理する関数
- データファイルを出力する関数
大まかな流れを言語化することで、プログラムに対して取り組むべき内容がはっきりします。
このように、コーディングまでのプロセスが明確になっていれば、「何を検索すべきか」「実装の中で足りない処理が発生するのか」考えられるようになります。
リファクタリング
実際に、目的に合ったプログラムが完成しても満足いかないケースが多々あります。
「無駄な処理があるのが分かった」「さらに詳細な処理を追加したい」といったケースです。
リファクタリングは出来上がったプログラムに対してコード追加/修正を実施し、コード全体の品質を高めることです。
そして、リファクタリングはプログラム全体を理解しているからこそ実施できる行為です。
ここまでくれば、漫然と回答探しやコピペをするだけの初学者ではありません。
一度実施したかしてないかは大きな差になるため、ぜひ取り組んでみましょう。