はじめに
Pythonは(そして筆者自身も)1989年の12月に生まれました。これに続く30年強の間に、筆者はたくさんのことをしてきましたが、Pythonにとっても実り多き年月でした。特にデータサイエンス、機械学習などの分野が顕著ですが、非常に多くの人がPythonを使ってさまざまなことを成し遂げています。Pythonは「何をするのにも2番目に適している言語だ」と言われてきましたが、実際のところ筆者にとっては、数多くのプロジェクトにおいて最高の言語であり続けてきました。
筆者はミシガン大学のコンピュータサイエンス学科でプログラミングに関する教育を受けました。コンピューターサイエンスに関して「伝統的」といえる教育を受けたわけです。当時のカリキュラムではC++とMATLABが中心で、この2つの言語を最初の会社でも使い続けました。次の職場では生物情報学関連のビッグデータの処理にシェルスクリプトやSQLもある程度使いました。そして、自分用のWordPressのサイトを作るためにPHPも使ったことがあります。
こうした言語を使っても、プロジェクトは無事完了できました(なかには、結構うまくいったものもあります)。しかし、どの言語もしっくりと来たわけではありませんでしたが、特に気にかけませんでした。なぜかと言うと、プログラミング言語というのはそういうものだと思っていたからです。仕事をするためのもので、面白さの対象としては考えられないものだと思っていたのです。そんなときに、一人の友人がRubyのライブラリを作るというプロジェクトのハッカーソンに誘ってくれました。
今まで白黒だった世界に、突然色がついたのです。無味乾燥な果物がおいしく感じられるようになりました。インタプリタ言語と人に優しいRubyの構文が、使うツールに目を向けさせてくれました。その後Rubyを長い間使ったわけではありませんが、自分のサイトではPythonとウェブフレームワークのDjangoを使ってみることにしました。この経験でもRubyのときと同じような楽しさを味わえました。そして学習曲線もとてもなだらかなものだったのです。それからというもの、他の言語にはほとんど手を出していません。
今やPythonは多くのプロジェクトでNo. 1の選択肢になっており、ソフトウェア業界に新しくやってきた人々は筆者が経験したような「トライ&エラー」を経験する必要はありません。ソフトウェア関連のキャリアへの新しく興味深い道も広く開かれています。こうした違いを抜きにして、Pythonのプログラミングに楽しみを見つける経験を共有できることを、そしてこの本がその喜びに貢献できることを期待しています。
筆者がある意味偶然出会ってしまった、素晴らしいPythonの世界を一緒に旅しましょう。皆さんがウェブサイトを作ったり、データパイプラインや植物用の自動散水システムを作ったりするのを見てみたいものです。皆さんが想像するどのようなものの実現にも、Pythonが助けの手を差し伸べてくれることでしょう。皆さんのプロジェクトの写真やコードサンプルをpython-pro-projects@danehillard.com
までお送りください。
本書について
この本では、どのような言語を使っている開発者にとっても役に立つ、ソフトウェア開発で使われる重要な概念を紹介します。プログラミング言語Pythonの基礎を身につけた人にとって、最適の本と言えるでしょう。
対象読者
プログラミングの入門段階を終えようとしている人のための本です。どちらかと言うと、ソフトウェア業界の人というよりも、それ以外の分野で自分たちの仕事を効率化したり、その質を上げたりするためにソフトウェアを利用している(したいと考えている)人々にとって、最適の本です。そうしたバックグラウンドの持ち主ならば、保守性の高いソフトウェアの構築が可能になり、そのソフトウェアを最大限に活用できるようになるでしょう。
自然科学においては、再現性と起源が研究プロセスの重要な側面となります。多くの研究がソフトウェアに依存するようになってきている現代において、人々が理解でき、更新でき、そして改良できるプログラムが強く求められようになっています。しかし、大学等の教育機関において、こうしたソフトウェアとその他の研究分野の「交差点」にいる人々のためのカリキュラムは開発途上の段階にあります。ソフトウェア関連の原則をきちんと学んでおらず、ソフトウェア開発の経験が限られる人々が、この本でソフトウェア開発における重要な概念や原則を身につければ、共有可能かつ再利用可能なソフトウェアを開発できるようになるでしょう。
オブジェクト指向プログラミングやドメイン駆動デザインの経験豊富な人にとっては、この本は少し初歩的すぎると感じられるでしょう。一方、Pythonやソフトウェア全般、そしてソフトウェアの設計の経験がまだ浅い人は、是非この本をお読みください。そのような人のために書かれた本なのです。
本書の構成
この本は4つの部と12の章から構成されています。Part IおよびPart IIには、短い例と練習問題が含まれています。Part IIIはPart IとPart IIをベースにしており、たくさんの練習問題が含まれています。Part IVはこの本を読み終わったあとの学びに関するヒントを提供しています。
Part Iでは、Pythonが広まってきた理由となぜソフトウェアの設計の重要性について説明しています。
- 第1章では、Pythonの簡単な歴史と、Pythonが使いやすいを説明しています。ソフトウェア設計の説明に続き、なせそれが重要なのか、そしてどのように日々の仕事に関係するのかを示します
Part IIでは、ソフトウェアの設計と開発の基礎になる重要ないくつかの概念を説明します。
- 第2章では、この本に登場する多くの概念の基本となる「関心の分離」について説明します
- 第3章では抽象化とカプセル化について説明します。情報を隠蔽し、複雑なロジックを単純なインターフェイスで提供することで、いかにコードがわかりやすくなるかを説明します
- 第4章ではパフォーマンスについて説明します。高速に実行されるプログラムを作るためのデータ構造やアプローチ、そのためのツールについて説明します
- 第5章ではソフトウェアのテストについて解説します。さまざまなアプローチを使いながら、単体テストからE2E(end-to-end)テストまで各種の方法を紹介します
Part IIIでは、Part IIまでに学んだ原則を使って実際にアプリケーションを作成していきます。
- 第6章はこの本で構築するアプリケーションを紹介し、プログラム作成の基礎をなす練習問題を提供します
- 第7章では、拡張性と柔軟性について説明します。アプリケーションに拡張性を与える練習問題が含まれています
- 第8章ではクラスの継承について説明します。どのような場合に継承を使うべきか、どのような場合には使うべきでないのかを説明し、構築中のアプリケーションに継承を導入します
- 第9章では、コードをコンパクトに保つためのツールやアプローチについて説明します
- 第10章では疎結合について説明します。構築中のアプリケーションで結合度を下げる方法を検討します
Part IVでは、この本を読み終わったあとで何を学ぶべきか、筆者のおすすめを紹介します。
- 第11章では、Part IIIまでに紹介しきれなかったデザインパターンと分散システムの2つの概念について説明するほか、Pythonを使う上で知っておきたい補足的な事柄を紹介します
- 第12章ではこの本全体のまとめと、今後の学びの指針を示します
最後に付録があり、Pythonのインストール方法を説明しています。
この本は最初から最後まで通して読んでいただくように書きましたが、Part IとPart IIの章については、既知の事柄はスキップしていただいても構いません。Part IIIは、練習問題として開発するアプリを少しずつ改良していく工程を含むため、すべての章を順番に読んでください。
コードについて
この本(訳書)の例題は訳者のGitHubのレポジトリで公開されています――https://github.com/mushahiroyuki/python-pro。詳しくは例題ページをご覧ください。
この本のすべてのコードはPython 3で書かれています。3.7以降のバージョンをご利用ください。
謝辞
この本は私が一人で書いたものではありません。執筆の過程のすべての段階とすべての側面で、私を助けてくださった皆さんのおかげです。
書籍の出版に関わったことのあるほとんどの人は、想像するよりもはるかに大変な仕事であることを語ってくれることでしょう。執筆の過程で、この言葉を何度も聞かされていましたが、本当に大変な仕事でした。どうしたものかといつも悩んだのは、日常生活とのバランスです。いつもの毎日の上に、新たな時間を見つけ出さなければなりません。
私のパートナーであるステファニー。あなたのサポート、励まし、私の愚痴に対する忍耐力は、この本を現実のものとするために必須でした。私の無視を軽く交わしてくれ、もっとも大変だったときにこのプロジェクトを忘れる時間を与えてくれたことに感謝します。あなたなしではこの本は完成しなかったでしょう。
私の両親、キムとダナ。いつも好奇心、創造性、思いやりのエネルギーを送り込んでくれていることに対して。
私の親友Vincent Zhang。夜中に何度もコーヒーショップの私の横で、コーディングしてくれてありがとう。この本のコンセプトが確定したときもいてくれましたし、あなたの検証がこのプロジェクトに私を駆り立ててくれました。
James Nguyen。進路変更をして、開発者への道を辛抱強く歩み続けてくれていることに対して。あなたは、この本の対象読者を体現していますし、あなたからのフィードバックはとても貴重でした。これからも頑張ってください。
ITHAKAの同僚たちのフィードバックとサポートに対して。何かとご迷惑をおかけしてしまったのですが、寛容に接してくださいました。
編集者のToni Arritola氏。私を根気よく勇気づけてくださったことに対して。本の執筆は予期しない厄介ごとの連続でしたが、あなたは一貫性と安定性を私にもたらしてくださいました。ありがとうございます。
テクニカルエディターのNick Watts氏。あなたのフィードバックはこの本の内容を、とりとめのない雑文集からそこそこのソフトウェアの参考書に引き上げてくれたと思います。あなたの率直なご意見と指摘は、とても貴重なものでした。
Manning社のMike StephensとMarjan Baceの両氏。この本のアイデアを信じ、私を信頼してくださったことに対して。そしてManning社のすべての人々は、筆者のアイデアを現実のものにしてくれるために辛抱強く働いてくださいました。
レビュアーの皆さんへ。次に上げる方々のご意見がこの本をよりよいものにしてくださいました。ありがとうございます。Al Krinker、Bonnie Bailey、Burkhard Nestmann、Chris Wayman、David Kerns、Davide Cadamuro、Eriks Zelenka、Graham Wheeler、Gregory Matuszek、Jean-Fran?ois Morin、Jens Christian Bredahl Madsen、Joseph Perenia、Mark Thomas、Markus Maucher、Mike Stevens、Patrick Regan、Phil Sorensen、Rafael Cas- semiro Freire、Richard Fieldsend、Robert Walsh、Steven Parr、Sven Stumpf、Willis Hamptonの各氏。
最後に、プログラミングおよびこの本に関して、直接的に、意図的に、あるいはその他の方法で、前向きな影響を与えてくださったすべての皆さんに、感謝いたします。すべての人のお名前を挙げることは私の能力の限界を超えてしまいますので、ここで思い浮かんだ方々のお名前だけをあげておきます。あしからずご了承ください。Mark Brehob、Andrew DeOrio、Jesse Sielaff、Trek Glowackiの各氏。筆者が勤務するSAICのアン・アーバーオフィスの皆さん、Compendia Bioscienceの皆さん(とその友人の皆さん)、Brandon Rhodes、Kenneth Love、Trey Hunner、Jeff Triplett、Mariatta Wijaya、Ali Spittel、Chris Coyier、Sarah Drasner、David Beazley、Dror Ayalon、Tim Allen、Sandi Metz, Martin Fowlerの各氏。ありがとうございました。
著者紹介
Dane Hillard(デイン・ヒラード)
高等教育関連のNPOであるITHAKAに、リード・ウェブアプリケーション・デベロッパーとして勤務している。これまで、遠隔測定法データのための推論エンジンの構築、および生物情報学アプリケーション用のETLパイプラインの構築などを行ってきた。
初期のプログラミング体験としては、エンターテインメント関連のSNSであるMySpaceのカスタムスタイルの作成、モデリング用アプリケーションRhinoceros 3Dのスクリプト作成、MS-DOSゲームのLieroのカスタムスキンおよびカスタムウェポンの作成などを行った。クリエイティブ・コーディングを楽しみ、音楽、写真、食べ物、そしてソフトウェアに対する自らの愛を一体化する道を常に探している。
PythonやDjango関連の国際会議で講演を行っており、誰かに「止めてくれ」と言われるまで継続する予定でいる。