Rのつく財団入り口

元はTRPG系のWebサイトの入り口だったブログです。最近のIT本の感想など。

【感想】Pythonプロフェッショナルプログラミング第2版

アクセス御礼

お陰様で先日の「PyQ」体験記事は、はてブのテクノロジーや学習の所にも載り、当ブログのアクセス最高記録を達成してしまいました。PyCon JP明けの運営元のビープラウド社さんからも反応を頂いたりしてありがとうございます。 iwasiman.hatenablog.com

 だいたい月1000PVぐらいが目標の目安かなぁと適当に考えていたのですが、2017年9月に限り月半ばで達成してしまいましたw
 ちなみにPyQの進捗の方はその後どーも仕事が忙しかったり週末は赤ちゃんと遊んだり世話したりで、「実務でのプログラミング習得」の途中からなかなか進めずにいます。ヽ(゚∀。)ノ

Pythonを使ったプロフェッショナルなチーム開発入門

 というわけでPythonのアツい流れに乗ってみんpy第4版の次の本は、やはりビープラウド社のスタッフ陣による『Pythonプロフェッショナルプログラミング第2版』。Pythonのお勧め書籍の中~上級者向け、ビジネスユース向け本によく名が上がる本です。

Pythonプロフェッショナルプログラミング第2版

Pythonプロフェッショナルプログラミング第2版

 初版は2012年3月、その後の変遷を反映したこの2版が2015年2月。この記事の2017年現在からすると若干古めのところも出ています。
 名前からまずPythonコードの高度な書き方やPythonistaな上級テクニックなど、「Effective~」「エキスパート~」系の本を想像してしまいますが実は違って、Pythonを使ったプロフェッショナルなチーム開発入門」とでもいうべき本。
企業での業務レベルでのアプリケーション開発での開発技法、モジュール類、ツールなどなど、Python開発周りで標準的によく出てきそうなキーワードと中身をまるっと網羅した本格的な内容となっています。ビープラウド社ではこのツールをこうやって運用している、という業務手法の紹介っぽい本でもあります。
 作業時の実際のコマンドの実行例なども豊富に乗っており、『Pythonエンジニア養成読本』のようなムックや『WEB+DB PRESS』系の雑誌連載記事なんかに載ってそうな実践的な内容です。以下、章ごとに簡単に紹介と感想を。

Pythonプロフェッショナルプログラミング第2版 サポート(サンプルファイルのダウンロードなど)

Pythonエンジニア養成読本[いまどきの開発ノウハウ満載!] (Software Design plus)

Pythonエンジニア養成読本[いまどきの開発ノウハウ満載!] (Software Design plus)

WEB+DB PRESS Vol.100

WEB+DB PRESS Vol.100

Pythonで開発しよう

1.Pythonをはじめよう

 v2系とv3系でよく話題になる仮想環境の作り方はvirtualenvを使ってじっくり解説しています。バージョン管理システムMercurialのインストールも。
 実際のコマンド例がが豊富に載っており分かりやすいです。エディタについては触りまでですが、Vimmer御用達の最強VimEmacs、PyCharmが紹介されています。コーディングスタイルの静的チェックのflake8、デバッガのpdbなど。

2.Webアプリケーションを作る

Webアプリケーションの基礎知識から始まり、1画面の簡単なゲストブックの作成まで。ここではPythonの軽量Webフレームワーク群の中でBottleの次に軽いというマイクロフレームワーク、Flaskが登場します。
 このFlask、本当に簡単ですぐ作れそうですね。なんとなくRubyの本に出てきた同じく軽量FWのSinatraみたいなものなのかなと思いました。

3.Pythonプロジェクトの構成とパッケージ作成

 ここでもツールはvirtualenvを使い、Pythonのパッケージ群の総本山であるPyPIからローカル環境にどうパッケージをどう入れていくか、自分で作る際のプロジェクト構成、setup.pyとかMANIFEST.inとかを用意してどうPyPIにアップロードするかが解説されています。
 Pythonでは1スクリプトファイルに関数やクラスをまとめるとモジュール、モジュールが複数あるとパッケージ、ライブラリという言葉は厳密には用語としては定義されておらず大体パッケージと同義だったと思いますが、パッケージのまとめ方は入門本などでも意外と載っていない事が多いので、こうやるのかーと思いました。

チーム開発のサイクル

 この辺りから、個人ベースでプログラムの勉強をしていたり試しにアプリを作っている人にはだんだん敷居が高くなってプロユース、業務ユース向けの本格的な内容になってきます。

4.チーム開発のためのツール

 あまりPython関係ない話なんですが(笑)、チケット管理ツールとしておなじみRedmineが登場します。バージョン管理のMercurialとの連携方法や、チャットでのSlack活用方法など。
 僕も仕事ではまだまだ全社標準でSkype for Businessなんですが、Web系の進んだ企業はみなSlackなんでしょうか。

5.課題管理とレビュー

 Redmineの活用方法や、チケットのテンプレートの実例。あまり周りでは見ないのですが本格的なチケット駆動開発の運用、レビューのポイントなどなど。この章もPythonは直接関係しないのですが、仕事のシーンではよく出てくる内容です。

6.Mercurialによるソースコード管理

 中身がPythonで実装されており、ビープラウド社でも採用しているMercurialの解説。
 Mercurialには特定処理で任意の処理を行えるフックという機能がありその活用や、ブランチやマージ、GUIクライアントの紹介などなど一通り解説されています。
 現実的な運用方法の BeProud Mercurial Workflow としてビープラウド社内でのワークフローのルールも紹介されています。一番最後にコラムでGitとMercurialの違いも載っています。

7.ドキュメントの基盤を整える

 この章ではまず最初にドキュメント作成で何をしたくないのか、どのような状態なら書きたくなるのかというのが考察してあって面白いです。ドキュメントを書きたがらないプログラマー/エンジニアはどこの会社でもよくいるんだろうなあと改めて思います。
 そしてWordやExcelよりも手軽に、コードと同じ感覚でテキストベースで作っていけるPythonの世界では標準的なドキュメンテーションビルダーツール、Sphinxの1.3についてかなり突っ込んで解説しています。

sphinx-users.jp

 Pythonコードのクラスや関数の2行目に"""で書く例のdocstringを組み込む方法や、ドキュメントポートフォリオとしてテンプレートみたいのを作っておく技法も紹介されています。
 この章はかなり充実しているのですがそれもそのはず、この「Pythonプロフェッショナルプログラミング第2版」という本自体もSphinxを使って執筆やレビューやソース管理等々を行ったそうですね。

www.slideshare.net

 うーんここまでビルド自動化に組み込むのは凄い。本格的に仕組みを作るとここまでできるんですね。

8.モジュール分割設計と単体テスト

 どうモジュールを分割してクラスや関数を入れていくか、アーキテクチャの話になってきます。
 これはPython標準というよりビープラウド流なのだと思いますが、よくあるMVCのモデルを分割する話は、ModelをDBなどで永続化されるDomailModelとApplicationModelに分けるという設計技法は参考になりました。後は全レイヤーから呼ばれるUtility、外部サービスの入り口に1枚かますServiceGatewayという構成で標準化しているそうです。

 ORマッパーでは詳しくは載っていませんがSQLAlchemyというのがPython界隈では有名とのこと。また、この章で出てくる典型的なプロジェクトのファイル構成の例は参考になります。
 テストツールでは標準ライブラリに入っているunittestの例、テストデータを準備できるtestfixturesやpytest、名前もそのままmock、機能テスト用ツールのWebTestやテストの自動実行ライブラリのtoxなどを解説。
 総じてPython言語界隈では、コードの実装と並行して単体テストもコードベースで用意していけるための仕組み、CIなどに組み込んで自動化する仕組みがが最初から充実しているなと感じました。このへん、Rubyなどモダンな言語はみな似通っていますね。

9.Pythonパッケージングと運用への活用

 モジュールの最新版以外をpipコマンドで取得するときの例、バージョンのルールや、もしもPyPI以外からパッケージを取ってくる場合の例など。

10.Jenkinsで継続的インテグレーション

 他言語の世界でも知ってる人はみんな知ってるJenkinsの話が登場します。ここでもテストモジュールのpytestが使えるそうです。pytest-covDjangoのテストも例が。Sphinxによるドキュメント作成のビルドもJenkinsでいけます。

サービス公開

 このへんも個人ベースで勉強中の方などにはちょっと縁が遠い内容です。

11.環境構築とデプロイの自動化

 大規模システムではよく出てくるサーバ構成の話、ミドルウェアのインストールなどなど。PythonRuby界隈でよく聞くnginxとかgunicornが出てきます。差がいまいちよく分からなかったのですが、gunicornがWebサーバで、nginxはWebサーバ+リバースプロキシとか他の機能も入ったやつなのでしょうか?
 他、キーワードDevOpsの登場で話題になったAnsibleによる環境構築の自動化の話も出てきます。このへんは他言語と同じですね。

12.アプリケーションのパフォーマンス改善

 パフォーマンス測定で、ここではApacheBenchを使っった測定と改善の例が解説されています。

開発を加速させるテクニック

13.テストを味方にする

 ドキュメントのレビュー、テスト設計のポイントについて。ここも正直Pythonとは直接関係ないのですが、業務ユースだとけっこう大事なところです。

14.Djangoを便利に使う

 PythonのWebアプリケーションフレームワークの中で一番本格的で全部乗せな、待望のジャンゴ1.7の話。
 この本の初版の頃はなかったそうですが今はDBのマイグレーションができるそうです。このへんもRubyRailsと同じですね。fixtureといってDBのテストデータをコードベースで用意したり、より便利なツールとしてfactory_boyの話、Django Debug Toolbarの話。
 僕は本業がSI寄りなのでDBのマスタデータはExcelとかCSVで用意してMacroでDBに入れたり、Object Browserなどで入れたりとDBはDBでコードと切り離して用意することが多いのですが、やはりPythonなどスクリプト系言語だとコード側で用意してそのまま単体テストに繋げるんだなーと改めて思いました。

15.便利なPythonモジュールを使おう
  • 日付変換の問題は他の言語でもよく出てきますが、これを便利にするdateutilの話。
  • インピーダンスミスマッチを解決し、Modelから辞書への変換を簡単にするbpmappersというモジュールの話。(これはビープラウド製なんですね。)
  • 画像変換モジュールのPillowの話。
  • データ暗号化のPyCryptoで、共通鍵方式AESや、公開鍵方式RSAでの暗号化/復号化のコード例
  • TwitterAPIであるtweepy
  • WebサービスREST APIが扱えるRequestsモジュールで、JSON変換は一発

 など、業務ユースでよく出てきそうな話題。RESTや暗号化の話を扱っているのは実戦的でよいなと思いました。Twitterとの連携とかも作ってみると楽しそうですね。

Appendix

Appendix A: VirtualBoxのセットアップ
Appendix B: OS(Ubuntu)のセットアップ

 ここはその通り、Oracle製の仮想環境作成ツールのVirtualBoxとウブントゥの話。普段Windowsで開発していると何となくLinuxに抵抗があるのですが、個人個人で仮想環境で作る手もありますね。

気になったところ

  • 本の紹介にも書いてありますが、2015年刊行なのでPython3でなくPython2.7.6ベースです。(但し上のようにPython自体でなく周辺技術の本なので、あまり影響しないと思います。) もしかしたら将来第3版が出るかもしれませんね。
  • 実装がPython製でビープラウドで使っている実例を併せて、というのも分かりますが、今どきのこの手の本でバージョン管理システムを解説するならやはりMercurialよりはGitかなあという気も。
  • 上述のように内容は非常に多岐に渡るため、読む人の立場や目的によって参考になるところ、読み飛ばしてもいいところの差が大きいと思います。RedmineとかJenkinsとかAnsibleの話はとりあずいらんという人もいるでしょうね。
  • これも内容が多岐に渡るため、キーワードや技術によって深く掘り下げているもの、軽く留めているものの差はあります。まあこれは続きはそれぞれのキーワードの専門書なりWeb資料なりに当たってくれということでしょうね。
     個人的には、WebアプリのDjangoの話やDBとのO/Rマッパーの話なんかはもうちょっとさらに知りたかったなと思いました。

まとめ:Pythonの仕事でのアプリ開発の定石・常識・主流が一通り押さえられる本

 ここまで紹介してきたとおり、Python言語自体の勉強をしている人にはちょっと敷居が高いので、他の言語仕様の本や入門書を当たった方がよいでしょう。
 内容は非常に多岐に渡るので、一度では僕も全部は理解しきれていないのですが、キーワードをざっと押さえていくだけでもPython界隈の主要ツールや開発スタイル、手法などが一通り網羅できます。
 例えば、さっと思いつくところで、Java言語でのよくありそうな開発と比べると……

Java Python
JDKを複数入れる時はJAVA_HOMEとかいちいち変えてるけど……? virtualenvや3系ならvenvが標準だよ!
EclipseみたいなIDEは……? テキストエディタならVimとかEmacsとかAtomとかSublimeとか、IDEならPyCharm、他にもJupyter Notebookとか色々あるよ!
CheckStyleFindBugsみたいな静的解析は……? flake8があるよ!
デバッグ実行できるの? pdbがあるよ!
懐かしのStrutsやいまいち情報が少ないJSFみたいなWebフレームワークは? 軽量がBottleやFlask、Rails相当全部乗せがDjangoだよ!
AntやMavenやGradleでjarやwarを作るみたいなことは? 既定の構成でパッケージが作れるよ!
ぐぐってApache Commonsからjar探したりしてたけど…… PyPIからpipコマンドで一発だよ! RubyRubyGemsPHPのComposer、.NETのNuGet、JSのnpmみたいなものだよ!
チケット駆動開発しちゃうぜい ふつうにRedmineでいけるよ!
ソースコード管理は? ふつうにGitやMercurialだよ!別にSubversionCVSでもやれるよ!
バージョン管理ツールに突っ込むプロジェクト構成は? この本にお手本があるよ!
クラス群のパッケージ分けルールは? パッケージングは意味が違うよ! Pythonにはスコープの定義はあるけど、Javaのパッケージ/C#PHP名前空間みたいのは厳密にはないよ!
JavaDocみたいにAPI仕様書を代用しよう Sphinxにdocstringを組み込めるよ! 事前に納品物件で合意しておこうね!
アーキテクチャで違うところは? MVCで大体同じ構造であれこれ工夫できるよ!
HibernateとかMyBatisとかJPAとか、O/Rマッパーはあるかな SQLAlchemyとか色々あるらしいよ!
JUnitみたいのでユニットテストを自動化したい unittest, testfixtures, pytest, mock, WebTest, Toxとか、かなり進化してるよ!
JaCoCoとかCoberturaとかでカバレッジをとってた (この本には出ないけど) coverageモジュールがあるよ!
夜中に自動ビルドでCIしちゃうぜ ふつうにJenkinsでいけるよ!
流行りのDevOPsでサーバ構築も自動化だ こっちもふつうにAnsibleだよ!
ApacheTomcatWebLogicJBossみたいなWebAPサーバは? nginxやgunicornがよく出てくるよ!
JMeterみたいので性能測定しよう この本ではApacheBench、他にも幾つかあるよ!
テストデータをOracleに入れてるけど Djangoマイグレーションとかfixture、Rubyのfactory_girlのboy版があるよ!
Java7までの日付型ってめんどう dateutilモジュールがあるよ!
最近ならApache Commons Cryptoで暗号化通信だ PyCryptoがあるよ!セキュアなシステムを考えてるフレンズなんだね!
JersyとかでREST通信 Requestモジュールがあるよ。これでWebサービスが作れるね。すっごーい!

……と、冗談も入っていますがこのように、「他言語でのxxに相当するPython界隈でのyy」的な対応がだいたい一通り網羅して理解できると思います。
 今度の開発プロジェクトでPythonを使うことになったチームリーダー、今度Python開発やるから環境回りの準備お願いと突然頼まれたマシン管理やインフラ系の人、開発技法やツールやキーワードを一通り押さえる必要の出てきたキーマンや上の人などなど、業務でチーム開発する現場をリードする牽引役の人には特に役立つのではないかと思いました。プロフェッショナルな現場向けの実戦本です。

関連書籍

 下の『Pythonエンジニア ファーストブック』は2017年9月に出たばかりの新刊で、同じくビープラウド社の方などが参加しています。
 Pythonプロフェッショナルプログラミング第2版と方向性も似ていてPython周辺の知識を一通り、比較的新人向けですね。

Pythonエンジニア ファーストブック

Pythonエンジニア ファーストブック

 完全初心者向けの『Pythonスタートブック』と名前が似ているのですが(笑)、2015年4月の『Pythonエンジニア養成読本』の改訂版で最新の内容です。Python3.6対応、バージョン管理の話もこちらはGitになっていますね。

massa142.hatenablog.com blog.iktakahiro.sh

 RedmineやJenkinsやAnsibleの高度な話はまだいいからスクレイピングやデータ分析、Djangoの話をもっと……という人には、こちらの本も併せて参考になりそうです。