社会人のメモ帳

忘れたくないことアレコレ

【エンジニアの独り言】プログラミングの勉強をどうすれば良いか②

プログラミングの勉強をどうすれば良いか

以前に「プログラミングの勉強をどうすれば良いか①」という記事において、プログラミングを始めとするIT分野を学ぶに当たって、身に着けておくべき "感覚" について述べさせてもらった。

簡単にまとめると下記の2つの思考が重要になるといった内容である。詳しくは前回の記事を参照。

  1. 数学的思考…現実の問題を数学の世界に落とし込む思考プロセス
  2. プログラミング的思考…課題解決のために必要な処理と順番を整理する思考プロセス

文部科学省が出している資料等、客観的な視点を取り入れるように努めて、勉強する上で必要な段階というものが整理できたと思う。要は上記2つの思考は義務教育で網羅されるべき内容ということだ。

ここからは自分なりの考えになるが、必要なのは「数学的思考/プログラミング的思考はプログラミングに役立つ」ということに気づかせることだと思う。ただ気づいただけでは意味がないかもしれないが、プログラミングを理解しようとする思考のプロセスに組み込まれるだけでも大きな進歩だと思う。

これからプログラミング学習をしようとする人は、「数学的思考/プログラミング的思考」の存在すら知らない、いわば「知らないことを知らない」状態だ。そこから存在を知ることで、「知らないことを知っている」無知の知*1状態へと移行する。ここでようやく学習の出発点に立てたと言える。

ここまでを独力でするのは無理なように思う。とりあえずプログラムの教材を買って読むだけでは、「知らないことを知らない」無知の知状態からは抜け出せない。とりあえずこの抜け出すキッカケ作りは必要だろう。

 

目標を考える

そういえば名言していなかったが、本ブログにおける「プログラミングの勉強をどうすれば良いか」におけるターゲットは、これまでプログラミングを触ったことがない社会人を想定していた。

前回の記事では「コードは半角英数で書く」という前提がない初学者を例として登場させていたが、そういった知識はIT業界で働いているものにとって「知っていることを知らない」レベルに感覚として身に付いている。

とはいえ、その "感覚" は一朝一夕で身に付くものではないはずだ。前記事を書く際に参考にさせていただいたプログラミング教育の手引きでは、プログラミング的思考を養うために留意すべきことが下記のように記されている。

思考力、判断力、表現力等は、短時間の授業で身に付けさせたり急激に伸ばしたりできるものではないことに留意する必要があります。「プログラミング的思考」は、プログラミングの取組のみで育まれたり、働いたりするものではありません。思考力、判断力、表現力等を育む中に、「プログラミング的思考」の育成につながるプログラミングの体験を計画的に取り入れ、位置付けていくことが必要となります。

文部科学省も長い時間と試行錯誤がいることを想定してカリキュラムを組んでいる。ただし本記事で対象としたい社会人には、そういった長い時間を費やしてプログラミング的思考を養おうという余裕はないかもしれない。

プログラミング的思考のことばかり語っているが、数学的思考も同様である。

こちらも小学校から高校という長い時間をかけて養うことが想定される力であり、社会人になっていきなり養おうとするのは無理がある。そんな悩みを抱えている者は多いのだろう。

プログラミング教育の書籍はたくさん出ているし、本ブログでも書評を書いている。

2つの書籍に共通しているのは「プログラミング的思考に重点を置いている」という点である。ただし数学的思考については言及がない。当たり前のようにジャンケンのグー/チョキ/パーを、0/1/2と数字に置き換えている。まずはその落とし込むという当たり前が初学者にはないということを踏まえるべきではないだろうか。

なぜならグー/チョキ/パーは100/200/300でも0/2/5でも問題はないのだ。数字に置き換えるというプロセスが一番大事なのだ。

 

課題の言語化

開発はまず要件定義から始まる。

要件定義とは顧客との間で認識をすり合わせ*2、必要な機能や要求を整理していく工程のことだ。ここで確定させておくべきことは多々あり、人によって意見が分かれる部分だと思うが、その最たるものは作るべき機能の切り分けだと思う。

顧客が実現させたい目的があり、それをITで実現しようとした時、どのような機能が必要かを顧客から吸い出していくことが求められる。

その方法を考えようとする時点で数学的思考が切っても切り離せないことは理解いただけるのではないだろうか。現実の問題を機械でも扱えるように落とし込むこともまた、大事なエンジニアの仕事である。

また、同時にプログラミング的思考が大事になってくる。自分の目的を達成するために必要な処理は何か? どのような順番で実行すればいいか? といったようなことを論理的に整理することが求められる。

これまで義務教育で数学的思考プログラミング的思考は身に付くという話はしていたが、義務教育のカリキュラムを社会人が今更するのはいささか無理があると感じる(無論人による)。

気になる方はScratchで遊んでみて欲しい。直観的にパーツを配置して、目指した動きを実現させることを目指すビジュアルプログラミングだ。配置したプログラムがアニメーションという形で動いてくれるのは、プログラムのコンパイルエラーや実行エラーといった諸問題が関係ないのも嬉しい。

しかし、実際の問題ではどのような処理が必要なのかを整理するところからプログラミングは始まっている。その経験を積むためには、実際の開発のように「実現したい機能」から「必要な処理と順番の整理」という段階からやるべきだと思う。

ここで問題となるとすれば「実現したい機能が思いつかない問題」だろうか。いわゆるプログラミングを学んでも何を作ればいいか分からないという良くある話である。そういう方におススメしたい言語がある。

Visual Basic for ApplicationsことVBAだ。

いわゆるExcelのマクロを実現してくれているプログラムだ。Excelは腐るほど触っている方も多いのではないだろうか。その業務の中で、地味に面倒だなと思う仕事はないだろうか。

それ、マクロで実現することができればプログラマーの第一歩である。

*1:古代の哲学者ソクラテスが提唱した「知らないことを自覚すること」が学びの出発点だとする考えのこと

*2:要件定義の前段階、要求定義で終わらせることが理想だが……そんな上手くいく現場ってある?