BLOG

プログラミングの勉強の仕方

投稿|2021年01月16日  更新|


研究室の後輩からよく,「田端さんはどうやってプログラミングを勉強したんですか?」と聞かれることがあります. しかし,プログラミングの勉強法なんて考えたこともないので,「習うより慣れろ」なんて言って,お茶を濁すこともしばしばです. ただ,数理を楽しんでもらいたいと思うからには,道標くらいは示す必要があったと,今思えば反省です.

振り返ってみると,わたしにとってプログラミングというのはとても高いハードルでした. というのも,修士の学生になるまで,Excelもろくに扱うことができず,ましてや,プログラミングに触ったこともありませんでした. そんなアナログ人間だったわたしが自分でコードを書けるようになるまでの過程で重要だと思ったポイントを,これからプログラミングを勉強して数理的な手法を使っていきたいと考えている人に向けて, いくつか挙げていこうと思います.

時系列順に並べると,

①初心者向けの講義を受ける
②初心者向けの本を読む
③何か自分でコードを書いてみる

といった感じでしょうか.・・・思ってた以上に月並みなことしか出てきませんでした.すみません. ただ,月並みなことしかないのに苦手な人が多い理由にもなんとなく心当たりがあるので,それも含めて個々について説明します.

①初心者向けの講義を受ける

初心者向けの講義を受けることは,プログラミングを勉強する機会を己に強制する手段として有効です.
プログラミングを勉強する際には,よっぽどの目的意識がない限り,そうせざるを得ない環境に身を置くのが手っ取り早いと思います. 最初から独学でもいいのですが,講義がペースメーカーの役割を果たしてくれるので,講義のほうが挫折するリスクは少ないと思います. 初心者向けの講義は,言語に関わらない一般的,かつ,重要な概念から教えてくれるので,そういった意味でも受講をおすすめします. また,どのプログラミング言語から勉強すればよいか迷うこともあると思いますが,数理を扱ううえではPythonを選んでおけば間違いないです.

プログラミングをするための環境構築が面倒なことが多いのですが,講義ではそこから教えてくれるので, 安心して始めることができます.

一緒に勉強する友達がいると,なお良しです.友達とわからんわからんと言いながら勉強するのは楽しいものです. プログラミングをやっていると,行き詰ったときに苦しくなるのですが,友達にここがわからんと口に出してみると,突然腑に落ちることも間々あります.

②初心者向けの本を読む
講義を受けたら,初心者向けの本を読んでみましょう.内容がすんなり理解できて,サクサク読めると思います. 講義に比べて,より細かいテクニックも書いてあるので,講義の次の教材として適していると思います.

ぜひやってほしいのが,本にあるコードを実際に自分で書いてみることです. そんな写経みたいなことしたくない,という人もいるかもしれませんが,やっておくとその後の成長は著しいものになります. 講義で耳から聞いて,本の内容を目で読んで,実際に手で書いて,インプットのチャンネルを増やすと理解が早まるというのが持論です.

本の内容をすべて理解する必要はないですし,空で書ける必要もありません.プログラミングに何ができて,どんな仕組みで動いているのかを, イメージできることが大事です.最初のうちは,いつ使うんだこの機能というものもたくさんあると思いますが,自分でプログラムを書くようになったときに, その機能を使うとこんなに楽に書けるじゃないかと思いつくことがあります.その時のために,一度動かしてみておくというのが大事です.

最近は,機械学習が流行っているので,「機械学習のためのプログラミング入門」みたいな本がたくさん出ています. ただ,プログラミング初心者の人がこのような本から始めるのは,正直お勧めしません. まず,機械学習入門のためのプログラミングはプログラミング初心者がいきなり理解できるような内容ではありません. 次に,機械学習のための出来合いのプログラムを外部からインポートして使っていることも多いので, プログラミングの勉強にはなりません. 機械学習の理論はわかっていても,プログラミングがわからなくて嫌になってしまうのだと悲しいので, やはり,プログラミングのための勉強にはプログラミングのための入門書を推したいです.

③何か自分でコードを書いてみる
プログラミングの基礎が理解できたとして,それで何ができるのか,コンピュータに何をさせたらいいのかを考えられることとは, 少し乖離があります.まず,その乖離を埋める道筋を説明させてください.
コンピュータに何をさせたらいいのかは,プログラミングよりもメタな目的によるので,はじめにそれをはっきりさせましょう. メタな目的とは,研究で言えば,どんな研究がしたいかです.それができたら,目的達成のために必要な要素を洗い出します. 洗い出した要素の中で,コンピュータで効率的にできることが,コンピュータにさせるべきことです.

ただ,それがコンピュータでできるかどうかが,初心者には見当がつかず,不安に感じる点だと思います. 結論から言うと,大概のことは何でもできます.それを実感できれば,勇気が湧いてきて,やりたいことの実現に向けて, プログラミングに取り組むことができます.

プログラミングで大概のことはできるんだ,ということを実感するためにおすすめなのが,本題でもある, 何か自分でコードを書いてみる,ということです.“何か”というのは,自分の興味領域の基礎的な技術がいいでしょう.

具体例として,わたしの話をさせてください.わたしは,学部生の時の卒業設計で広場を設けたのですが, 広場にどんな歩行路を設けたらいいかわからなかったのが,心にひっかかり続けていました. それがきっかけで,広場を注視することが多くなったのですが,そのとき,人は広場に設けられた歩行路じゃないところも歩いていて, それが道のように跡として残っていることに気が付きました.プロも人の歩行路を捉えきれていないことを理解したわたしは, 歩行路以外も含めた空間上で人の歩行軌跡を予測できるようにしようと考え至りました.これが,どんな研究がしたいか,です.

わたしは,「人は,地面の仕上げや空間用途に応じた物理的・心理的抵抗を加味した最短路を歩行する」という仮説をたてました. この仮説を検証するために,1)コンピュータ上に空間を再現し,2)地面の仕上げに応じて移動抵抗を設定し,3)最短路を計算し, 4)それが地面に残った跡とどれだけ似ているかを計算する必要がありました.これらが,目的達成のために必要な要素,です.

これらの要素の中で,3)最短路の計算は数理の中で最も基礎的な技術になります.ダイクストラ法というアルゴリズムですが, それ自体は1950年代に提案されているものであり,レファレンスもたくさんあります.わたしは,プログラミングに慣れるために レファレンスを見ながらダイクストラ法を自分でプログラムしました. この経験が,何か自分でコードを書いてみる,ということです.
すでに提案されたものを自分で書くのは,「車輪の再発明」とも言われて忌み嫌われることもあるのですが, “車輪”くらい確立されたエレガントなアルゴリズムを追体験することは,初心者にとって有意義だと感じます. エレガントなアルゴリズムを自分で書くことができて,それによって目的の出力が得られたという経験が,初心者を勇気づけます.

自分でプログラムを書くときに注意してほしいのが,正しく動くことが正しいということを意識することです. まじめな人ほど,コードの書き方が正しいかどうかを過度に気にする傾向にあるのですが, そんなことははっきり言ってどうでもいいです.論理的に正しく動いていて,正しい出力が出ればそれでいいのです. 他者と共同で開発するような場合は別ですが,可読性や速さは,自分にとって十分であれば自分の研究をする上では 問題ありません.

そんなこんなで,修士に入るまでアナログな人間だったわたしが,プログラミングを自分で書けるようになり, それを使って査読に耐える研究ができるようになりました. なので,みなさんも恐れることはありません.プログラミングを身に着けて,数理的な手法を自分のものにしてください.

田端祥太
e-mail: tbtgoat.contact[at]gmail.com