はじめに

[Up] [Repository]

プログラマ的な感覚について

本書ではPythonをゼロから学ぶ。しかし始める前に、なぜPythonを学ぶべきなのか?Pythonを学んでどうするのか?について少し伝えたいことがある。

本書の目的は「これまでプログラムを組めなかった人がプログラムを組めるようになること」ではない。また、プログラム言語としてPythonを扱うが「Pythonをマスターすること」を目的とはしない。そもそも全くプログラムを組んだことがない状態から、半期の講義を受けたらPythonをバリバリ組めるようになる、というのは不可能だ。

では何を目的とするか。それは「これくらいのプログラムを書けば、これくらいのことができるんだなぁ」という「感覚」を身につけることだ。これから短いプログラムから、それなりに長いプログラムまで多数組むことになるが、そこで文法とか、ライブラリの使い方などを覚える必要はない。ざっくりと「Pythonにはこんなライブラリがあり、それを使うとわずか数行でこれくらいのことができる」ということを頭の片隅に置いてくれればそれでよい。

なぜプログラムを覚えるべきか。それは今後プログラムが就職活動に必須スキルになるからでもなく、ましてAIがブームだからでもない。「プログラマ的な感覚」を身につけるためだ。たとえ日常的にプログラムを組んでいなくとも、「プログラマ的な感覚」を身に着けた人は、そうでない人に比べて作業能力が桁違いに上がる可能性がある。

例を挙げよう。あなたは、あるフォルダの中にある100枚くらいの画像を全て半分にリサイズしなければならない。とりあえずWindowsを使っていて「ペイント」を使ってファイルを開き、「Ctrl+E」でイメージのプロパティを開けば幅と高さを調整できることは知っているとしよう。「プログラマ的な感覚」がなければ、頑張って「ペイント」で100枚修正してしまうかもしれない。

ここで、この講義を受けた人は、詳細は覚えていなくとも「少なくともPythonには画像を扱うライブラリがあり、リサイズもできるはずで、またフォルダの中のファイル一覧も簡単に取れるに違いない」と思うだろう。そして「Python 画像 リサイズ」や「Python フォルダ ファイル 一覧」などのキーワードで検索し、以下のようなコードを書く。

import glob
from PIL import Image

for file in glob.glob("*.png"):
    img = Image.open(file)
    (w, h) = img.size
    img.resize((w//2, h//2), Image.LANCZOS).save("resized/"+file)

カレントディレクトリにあるPNGファイルを、半分のサイズにしてはresizedというフォルダに放り込んでいくスクリプトである。たった6行だ。

もしくは、「これくらいのことならPythonを使うまでもないかもしれない」と思い、「画像 リサイズ 一括」というキーワードで検索して、ImageMagickというツールにたどり着くかもしれない。それなら一行でできる。

mogrify -path resized -resize 50% *.png

ここで重要なのは「PythonのglobやPILというライブラリの存在や使い方を覚えていること」でも「ImageMagickというツールを知っていること」でもない。「これくらいのことなら数行でできるに違いない」という感覚である。プログラマ的な感覚を身に着けていない人は、そもそも「これは簡単にできるだろう」という発想がないため、検索もできない。

もしかしたら「プログラムの素養がなくたって画像のリサイズくらいなら自動でできると思いつく」と思うかもしれない。では、こんな課題はどうだろう?あなたは卒業研究でトランジスタの特性を調べることになった。それぞれのトランジスタにはあるパラメータがあり、異なるパラメータを用いて作られている。そのトランジスタの電圧ー電流特性が、以下のようなテキストファイルに保存されているとしよう。

0.0 0.0
0.1 0.01
0.2 0.2
0.3 0.8
...

このようなデータが、トランジスタのパラメタを含めてdata_48.datといった名前で保存されており、それが100個近くある。トランジスタは、ゲートにかける電圧がある「しきい値」を超えると電流が流れ始める。このデータに適当にフィッティングをかけることで、「しきい値」を求めたいとしよう。ファイルそれぞれのデータにフィッティングをかけて、ファイル名のうしろにある値(この場合は48)をx軸に、しきい値をy軸にしてプロットしたい。

「画像のリサイズ」は一般的なニーズだからツールがあるが、この卒論のテーマはあなたしかやっていないからそんな便利なツールはない。ここで、もし「プログラマ的な感覚」がなければ、一つ一つエクセルでファイルを開き、スレッショルドを求めて、別のエクセルシートにパラメタとして記入していくかもしれない。そして徹夜で作業して「卒論がんばってる!」と錯覚するかもしれない。しかし、もしあなたが「プログラマ的な感覚」を持っていれば、「これはPythonを使えば、長くても数十行でできるな」と思うはずだ。

くりかえしになるが、必要なのは「知識」ではなく「感覚」である。「globを使ってファイル一覧を取得し、SciPycurve_fitでフィッティングをかけることができる」ということを覚えておく必要はない。大事なのは「そういうことが簡単にできるはずだ」と思うことで、そう思うことができれば「Python フィッティング」で検索すればすぐにscipy.curve_fitにたどり着けるはずだし、もしかしたらPythonではなくRを使いたくなるかもしれない。調べて試してみるたびに、あなたのスキルはどんどん増えていくことになる。

こういった考えは別にPythonに限らない。エクセルを使っていても、面倒な処理を見た時に「これは一括でできるマクロがあるに違いない」と思って探すかどうか。毎日決まった時間に、あるウェブサイトにアクセスして、ある値を読み取らないといけないという「仕事」が与えられた時に、「ウェブサイトにアクセスして値を読み込めるツールがあるに違いない。毎日決まった時間に何かを自動的に実行する方法があるに違いない。それを組み合わせれば良い」と思えるかどうか。これが「プログラマ的発想」である。

こういう発想ができるようになれば、日々の作業効率が飛躍的に向上するのが想像できるであろう。別に全ての作業を自動化する必要はない。プログラムは何かの目的を達成するための手段の一つに過ぎず、プログラムするか、ツールを導入するか、それとも今回は手でやるか、自動化のためのコストと、自動化しなかった時のコストを考えて、その時その時に最適と思える選択をすればよい。

細かい文法などは最初は気にせず、必要に応じて調べれば良い。「Pythonはこういうことができるんだな」「それはこれくらいの作業量でできるんだな」という「感覚」を頭の片隅に残すこと、それを目的として学習して欲しい。

謝辞

本書は慶応義塾大学理工学部物理情報工学科の講義「プログラミング基礎同演習」のテキストとして執筆されました。Google Colabを利用して講義するというアイディアは、同科の内山孝憲教授によるものです。本講義にあたり、同科の國府方大喜さん、原啓太さんにはTAを担当していただきました。特に國府方さんには多数のミスを指摘していただきました。講義では学生さんから多数のフィードバックを頂きました。特にレポートの考察やコメントを読むのが毎回楽しみでした。渡辺研究室の学生さんからは、多くのミスの指摘や改善の提案をいただきました。皆様に感謝いたします。