Stimulator

機械学習とか好きな技術話とかエンジニア的な話とかを書く

「実用的でないPythonプログラミング」がよかった

はじめに

2020/8/12に発売されたImpractical Python Projects: Playful Programming Activities to Make You Smarterの日本語訳書である、「実用的でないPythonプログラミング」をひょんな事から献本していただく事になった。(訳者が同僚である)



ありがちなプログラミング初学者向けの本から1段上がった中級者向けの良い本だと感じたので、当ブログでたまにやっている筆者、訳者に媚びを売るシリーズの一貫として、感想を記す。


 

書籍の概要

実用的でないPythonプログラミング」は、想定する中級レベルのアルゴリズムの問題を例に取り、Pythonでの美しいコードの書き方や、コンピュータサイエンスにおける基礎知識、オブジェクト指向プログラミングの必要性を説いていく形で執筆されている。


以下は、章ごとに出される問題とそこでのキーワードをまとめてみたものだ。パッと見渡してもコンピュータサイエンスの基礎知識をなぞっているのが、よくわかる。

1.【乱数による名前生成】Pylint、DocString
2.【回文の検出】semordnilap、cProfile、ハッシュテーブル、再帰
3.【アナグラムを解く】Sort、collections、モジュールの分割、トライグラム、バイグラム
4.【暗号解読】ルート転置式暗号、レールフェンス暗号、総当たり攻撃と探索
5.【暗号解読と生成】null暗号、語彙のリストと安全性
6.【MS Wordの取扱】OSの差異、フォント、カーニング、トラッキングpython-docx、ヴィジュネル暗号
7. 【良いネズミの育成、金庫破り】組み合わせ最適化遺伝的アルゴリズム
8. 【俳句の音節の検出】自然言語処理コーパス、CMUdict、nltk
9.【俳句の生成】マルコフ連鎖デバッグ、スキャフォールド、logging、チューリングテスト
10.【銀河系のモデリングフェルミパラドックス多項式、ドレイクの方程式、グラフィカルモデル、ユークリッド距離、NumPy、SciPy、tkinter
11.【モンティ・ホール問題】モンテカルロシミュレーションオブジェクト指向プログラミング、tkinter
12.【老後資金シミュレータ作成】確率的サンプリング、モンテカルロシミュレーション実応用
13.【火山活動シミュレーション】pygameOpenGL、math、ラジアン、三角法、ベクトル
14.【万有引力ケプラーの法則のシミュレーション】複雑な問題のソースコードへの落とし込み、ゲーム作成
15.【天体画像の精細化】画像処理、画像補正、スタッキング、pillow
16.【不正検知】ベンフォードの法則、matplotlib

 
実際に上記のような問題に当たる上でも、ユニークな問題の与えられ方をする書籍でもある。

例えば、暗号の章では実際の南北戦争時代などのエピソードを例題として扱っていたり、回文ではハリーポッターを引用している(酷いネタバレでもある)。モンティ・ホールゲームの図解なども、複雑な問題を受け止めやすいような図解があり、優しい大学の講義を彷彿とさせる。

f:id:vaaaaaanquish:20200830175434j:plain:w400
モンティ・ホールゲームに関する例題の図

ユニークな問題に対して、解答となるソースコードが全て公開されている点も大きく評価できる。
中級者向けの問題だけあって、実際に問題を解く場合にはそれなりの量のコーディングが必要となるが、解答とそのコードの解説を数行単位で行ってくれており、最悪自分でPythonを書かなくても理解に及ぶだろう。

アルゴリズムについても図解や数式の解説が散りばめられており、例題と合わせて利用することで、前述したキーワードに関連する内容がスッと入ってくるようになっていると感じた。

f:id:vaaaaaanquish:20200830175438j:plain:w400
回文に関するアルゴリズムの図解

これらを課題のように進める中で、計算量の肥大化、コーディングにおけるオブジェクト指向の重要性、インターフェースなどを意識させる形にもなっており、最後の14〜16章あたりにおいては、それなりに大きなGUI付きのプログラムを作成できるようになっている。
この進め方も、より一般的なコンピュータサイエンスの講義に近いものを感じる。

 
また、何より素晴らしいのは、章ごとに書籍以上の情報を参照したい場合のURLが書かれている点だ。

f:id:vaaaaaanquish:20200830180516j:plain:w400
さらに読むなら

引用に加えて、専門書以外でこれが出来ている書籍は多くはない。様々なCSの問題に対して興味を持つための足がかりにもなるだろう。


 

どういう人がターゲットか

前述した、問題とキーワードに対して感じる内容は、概ね「バックグラウンドとしてコンピュータサイエンスに近い学科を卒業しているか」に依る印象がある。

私自身は高専から大学院までCSの学科に所属していた事もあり、上記キーワードに対して「大学1~3年程度で演習に出てくるワード一覧である」と読みながら感じた。情報工学科などを出た大学生であれば、記憶にうっすらある状態であろうとも、調べて思い出しながらであればスラスラ問題を解く事ができるのではないだろうか。

CS出身者はある意味ターゲット層には遠いかもしれない。
昔懐かしい問題演習として購入してみる形であれば、面白い題材が詰まった良い本であるとも言える。

 
レベル感としては、競技プログラミングより少し応用を意識している(ユーザインタフェースの作成、オブジェクト指向への誘導など)。
一方で問題を汲み取り、アルゴリズムソースコードに落とし込むことを鍛える側面もあり、競技プログラミングに入る前後で力を付けるために読んでも良さそうである。

 
CS出身者でない方には非常に読んで実践してみて欲しい書籍ではある。
ただし、大学の1年分の講義を集約したような書籍ではあるので、時間がかかる事を覚悟してトレーニングとしておすすめしたい。加えて、初学者向けの書籍とは違って、1単語1単語丁寧に解説してくれている訳ではないので、ある程度未知の単語を調べながら、知識欲に従って楽しく進めると良さそうである。

本書籍を読むことで、アルゴリズムに関連するトレーニングができるだけでなく、新しい知識への取っ掛かりも得られるはずである。
あと、CS出身者の謎のあるある会話に入り込めたりするメリットもありそうだなと感じた。

 

おわりに

実用的でないPythonプログラミング」のタイトルにもある通り、例えばWebサービスを構築するエンジニアが日常的にこの書籍の知識を使うかと言われたら「実用的ではない」と答えるだろう。近年では、ソフトウェアエンジニアも多様化してきているので、ある側面で実用的でないのは確かである。

一方で、コンピュータサイエンスが実用的でないかどうかに対する答えは、訳者が「実用的でないと言いつつ実用的な本になった」とあとがきで語っている通り、プログラミングを行う上で基礎知識として必要なものにもなりうる。
 
私個人としては、Python初学者向けの本を読んだ後、基礎を固める上で重要な項目が散りばめられた書籍でもあると思うし、多くのソフトウェアエンジニアが学んでおくべき内容である、とも思う。現に近年では、IT企業においてこのようなコンピュータサイエンスに関連したコーディング試験を面接で実施するのは一般的になっているし、自分が所属する企業でも、バックグラウンドに関係なく本書籍に乗っているようなレベルの問題を解く力は必須になっていると感じる。


こういったコンピュータサイエンスを書籍の中でも、問題に寄ったドリルのような書籍である。

 
ソフトウェアエンジニアの皆様には、是非ともベースラインを高める意味でも、トレーニングの意味でも実際に手に取って読んで問題に挑んでみる事をおすすめしたい。