エバンスの雑記帳

MBA、Python、子育て、将棋、文房具、その他

プログラミング勉強方法

こんにちは。文系なのにPythonにハマっているエバンスです。
「プログラミングは、どうすれば上達するか?」と後輩に聞かれた際の私なりの答えを、せっかくなのでブログに残したいと思います。
なお、言語(Python)自体の勉強方法については、以前の記事を参照してみてください。

evansmode.hatenablog.jp

ちなみに、ようやくPaiza learning のAクラスを解くことができました!これもプログラミング力(プログラミング的思考力?)向上のおかげだと思っています。

プログラミング的思考とは

プログラミング的思考(論理的思考)って何? [3ページ目] - 日経トレンディネット

こちらの記事曰く、プログラミング的思考とは、次の5つの能力から構成されるそうです。

  • 抽象化する能力
  • 分解して理解する能力
  • やるべきことを順序立てて考える能力
  • ベストな方法か分析する能力
  • 方法を他に置き換えて一般化する能力

個人的には、この中では「抽象化(数学だと一般化?)する能力」「分析して理解する能力」「順序立てて考える能力」の3つが大事だと考えています。また、実際のプログラミングでは、コーディングの効率性も考えて、これに加えて「言語の知識」が問われるように思います。

抽象化・分析して理解する能力

抽象化と分析して理解することは表裏一体な気がしますが、これら能力がないと、冗長なコードを書くはめになります。

例えですが、「1から10までの整数の合計は?」という問題に対して、大人であれば、(1+10)×10/2 = 55ということを知っている(もしくはすぐに法則性を発見できる)と思います。ただし、この問題を初めて見た子供は、1から10まで少しずつ足しあげていこうとするはずです。時間がかかりそうですね。

↑の例は、10をyという変数にした場合には、(1+y)×y/2 と抽象化できます。これを知っている(またはすぐに思いつける)ということが重要だと思います。

最初は抽象化することに慣れないと思いますが、プログラミングをしていて、「条件分岐がみるみる増えていく」、「ループ処理の中にループ処理が山ほどあってもはやイミフ」等、思い当たる節があれば、どこか抽象化できないか、一度手を止めて色々と考えを巡らせてみると良いと思います。

私の場合、気付けば無駄に変数を多く設定していて結果的にコードが読みにくくなっていたり、個別ケースに対応(力技)で乗り切ろうとして抜けや漏れが存在し、テスト段階で気づく、というようなことがあります。なるべく早い段階から抽象化できるものはしておいた方が後々楽ですし、プログラムも結果的に読みやすく・メンテナンスしやすくなります。

また、この能力を鍛えるには、普段からプログラミングする際に、関数を作成することだと思います。関数を作成するときは、そもそも処理に必要な最低限の情報しか関数に渡そうとしませんし、関数を作成するには抽象化は避けて通れません。是非試してみてください。

順序立てて考える能力

コンピューターは「適当にやっておいて」と支持できませんので、細かい手順についても指示する必要があります。しかも、コードは1行ずつ実行されていきますので、指示の順序は非常に大切です。要は「計画力」です!

この能力は、ある程度慣れの領域だと思いますが、鍛える方法としては、コーディングの前にプログラムの設計図をキチンとアウトプットすることだと思います。

私の場合、プログラミングをする前には必ず、考えているプログラムの内容をメモします。自分でしか理解できないような単語と矢印満載の怪しいメモレベルのもの(他の人と共有する必要があればワードやパワーポイント等で清書します)ですが、頭の中で考えていることを紙に写す際に、矛盾や抜け漏れがあることにしばしば気づかされます。また、予め自分がプログラミングする内容を正確に捉えておくことで、コーディングの時間は驚くほど短くできます。

言語の知識

言語の知識は、上の二つの能力を助けてくれるものだと思います。Pythonで言えば、リストの知識があれば、データ構造の管理について思い悩むことを省略できますし、ライブラリのmatplotlibを知っていれば視覚化については簡単に目途がつけられるわけです。

そのため、言語の知識についてはある方が良いに決まっていますが、時間的な制約が厳しくないのであれば、使う時に初めて理解するのでも問題ない気がします。むしろ、知っているだけの状態だと、実際にコーディングしてテストした際に「こんなはずでは。。」ということがよくある(Python3のroundは完全に初見殺し。。)ので、「知っている状態」よりも「使ったことがある状態」まで引き上げておいた方が好ましいです。

なので、コードを勉強する場合には、ブログなどを読んで納得するのではなく、自分でコーディングするところまでセットとしてとらえておくことを強くオススメします!

まとめ

プログラミング力は、主に「抽象化」「計画力」「言語の知識」の3つから成り立っていると考えます。それぞれ苦手な部分をつぶしていけば、よりスムーズにプログラミング(構想からコーディングまで)を完遂をすることができるようになると思います!