見出し画像

「ゼロから学ぶPythonプログラミング」という本が出版されました

ゼロから学ぶPythonプログラミング Google Colaboratoryでらくらく導入 (KS情報科学専門書)という本が出版されました。

画像1

これは僕が大学で担当しているプログラミングの講義の講義ノートとして書かれたもので、もともとは出版を目的に書いたものではなかったのですが、講談社サイエンティフィクの担当さんからの勧めで出版させていただいたものです。どういう気持ちでこの講義をしていたか、そしてこの本を書いたかをちょっとまとめてみたいと思います。

この本のタイトルには「Pythonプログラミング」とあり、言語としてはPythonを使っていますが、「はじめに」で明記している通り、Pythonプログラミングを学ぶことを目的としていません(そもそも僕はRubyistだったりします)。僕が独学でプログラミングを学んだこともあり、「プログラミングは自分で学ぶもの」という感覚があります。講義でプログラミングを教えるにあたり、僕が重視したのは「プログラミングでこんなことができるんだ」という「感覚」を身につけることでした。

僕がプログラミングに触れたのは小学生の頃でしたが、まともにコードを組めるようになってきたのは高校生だったでしょうか。友達とゲームを作ったり、ナンプレやイラストロジックを解くプログラムを書いたり、オセロのAIを遺伝的アルゴリズムで進化させたりして遊びました。その時、「プログラムはなんでもできるんだ」という、一種の「全能感」を感じたのを覚えています。目に触れるもの、全てプログラムで表現することができるのだと。

僕が講義で重視したのは、Pythonの細かい文法やプログラミング用語を覚えることではなく、「様々なことがプログラムで表現できる」という感覚でした。例えば、第1章では、五芒星を描画する課題が出てきます。

画像2

この発展課題として「N芒星を描画せよ」という指示があります。Nが奇数のときにはうまくいきますが、Nが偶数の時にはうまくいきません。少し工夫するとNが偶数の時でもN芒星を描画できるのですが、N=6の時、つまり六芒星だけはうまく描画することができません。それはなぜか考えましょう、という問題です。

実は、これはNを法とする剰余類で、1<k<Nであるような数kによる巡回群を作りなさい、という問題になっています。Nが偶数、たとえば8の場合、kを3にすれば巡回群の位数がNに一致するため、八芒星を作ることができます。しかしN=6の場合、1<k<6であるようなk(2,3,4)はすべて6と互いに素でないため、六芒星は一筆書きで描くことができません(k=1,5の時には単純な正六角形になります)。こんな簡単なコードで、群や類といった問題を「可視化」することができる、ということが伝えたくてこんな課題を考えました。第2章で複素ニュートン法を使ってフラクタル図形を描画したり、第3章でコラッツ問題の可視化を行うなど、最初は「プログラミングで数学を楽しむ」ことに重点が置かれています。

他の章の課題も、学生さんが試して楽しい、結果を見ていろいろ考察できるように工夫しました。第4章「リストとタプル」では、「タプルのリスト」を与えることで、オリジナルのフラクタル曲線を作ることができるコードを書きました。以下は講義で学生さんが作ってきたオリジナルのフラクタル曲線の一部です。「タプルのリスト」が、フラクタル曲線の遺伝子のような役割を果たしています。

画像3

大学の他の科目との関係も重視しました。例えば第9章では、NumPyやSciPyの使い方を題材にしていますが、実際には井戸型ポテンシャルに閉じ込められた電子がトンネル効果で染み出していることや、絶対値最大の固有値に対応する固有ベクトルが基底状態の波動関数に対応することなど、量子力学や線形代数を学ぶ単元になっています。井戸型ポテンシャルや固有値・固有ベクトルなど「授業でやったけど、いまいち実感がわかなかった」であろう概念について、実際にプログラミングで再現、可視化することで「なるほど」と思ってもらおうと思って作った課題です。

実生活に現れる問題を題材とした課題も多く作りました。第11章は動的計画法を扱っていますが、動的計画法を学ぶことが目的ではなく、我々は例えば「レストランでメニューを見ながらカロリーや価格といった制約条件の中で幸福度を最大化する」といった最適化問題を日々解いているのだ、ということを意識してもらうのが狙いです。第12章は乱数が主題ですが、発展課題で「コンプガチャ」を扱っています。「一枚CDを購入すると44種類のポスターのうち一枚がランダムにもらえて、44種類のポスター全て揃えると特殊なイベントに招待される」という、どこかで聞いたようなシチュエーションで、実際に44種類そろえるのに何枚CDを買う必要があるかをシミュレーションし、コンプガチャは違法とすべきか合法とすべきかを検討してもらっています(毎年、力作の考察が寄せられて読んでいて楽しい課題になっています)。他にも、第6章の「テレビの普及率と寿命の関係」、第14章の学歴と給与の関係など、データの解析を通じて「データとどのように向き合うべきか」を考えてもらっています。

「応用寄り」としては、第5章で青空文庫のデータを取得してワードクラウドを作る課題があります。「ウェブから情報を取得してデータを可視化する」という、一見難しそうな(でもやってみたい)処理が簡単に実現できることがわかり、学生さんにウケが良いです。発展課題として、自由に作品を選んでワードクラウドを作ってもらっていますが、作品選択に学生さんの個性が出て面白いです。例えば宮沢賢治の「銀河鉄道の夜」を選ぶとこんな画像が得られます。

画像4

こうして「プログラムで何ができるか」に重点を置いている一方「プログラミングそのもの」についてはほとんど紙面を割いていません。必要になれば検索すれば良いと思っているからです。唯一「スコープ」と、それにからんだ「参照の値渡し」だけは、後で問題を起こしたときにこの概念を知らないと検索が難しいために少し詳しく触れています。また、PythonでCSVを扱う場合はPandasを使うのが一般的だと思いますが、第6章でCSVを扱うときに、わざわざファイルを開いてsplitして辞書を使ってデータを扱っています。これは「裏で行われている処理をブラックボックスにしてほしくない」という意図からです。第14章ではちゃんとPandasを使っています(ただし、使い方の説明はほとんどしていません)。

力不足を感じたところもあります。前述の「裏で行われている処理をブラックボックスにしてほしくない」という気持ちから、第10章でPythonの実行の仕組みを説明しています。抽象構文木からバイトコードに落として仮想マシンで実行される流れを説明し、実際にスタックマシンの例として逆ポーランド記法の電卓を作ってもらいましたが、学生さんはついてくるのが難しかったようです。ここをどう教えるか、そもそも初学者に教えるべきかどうかは今後の課題です。

本書は、全体を通して「今は理解しなくて良い」というフレーズが頻出します。細かいやり方を覚えていなくても、後で似たようなシチュエーションに出会った時「あ、これ昔やったな」と思えば、少なくとも数行〜数十行書けばプログラミングで扱えることを思い出すはずです。以前、「検索すれば必要な知識が出てくるので勉強の必要はない」と言ったYouTuberがいました。問題に直面した時、やり方は全く覚えていなくても「これはプログラミングで簡単に実現できるはずだ」と思えば、適宜調べて実現できるでしょう。しかし、その感覚がなければそもそも検索しようと思うことはできません。こういった感覚を本書では「プログラマ的感覚」と表現しましたが、プログラミングに限らず、大学ではそういう抽象的な問題解決能力を学んで欲しいと思います。

講義では毎回レポートを課しました。100人近くが受講しているため、千枚以上のレポートを採点することになり、大変ではありましたが、学生さんがプログラムを自分で工夫したり凝った考察を書いてきたりするのを読むのが楽しみでした。ある学生さんがレポートの感想欄に「プログラムってなんでもできるんですね」と書いてきたことがありました。その感覚こそ、僕自身がプログラミングを学んで感じたことであり、この講義で皆さんに伝えたかったことです。

この記事が気に入ったらサポートをしてみませんか?