Python開発の変遷

をPythonプロフェッショナルプログラミングの

改訂の歴史から知る

Takanori Suzuki

PyCon mini Tokai logo

PyCon mini Tokai / 2024 Nov 16

Agenda / アジェンダ 📜

  • Pythonプロフェッショナルプログラミング(以下: PyPro)出版の歴史を紹介

  • 章ごと改訂の歴史を見る

Goal / ゴール 🥅

  • Pythonチーム開発の変遷を知る

  • 自身のプロジェクトの参考になる

    • なにか導入してみたくなる

  • (PyPro4を買いたくなる🤑)

Photos 📷 Tweets 🐦 👍

#pycontokai / @takanory

slides.takanory.net

slides.takanory.net

Who am I? / お前誰よ 👤

takanory profile kuro-chan and kuri-chan

PyCon JP Association 🐍

日本国内のPythonユーザのために、Pythonの普及及び開発支援を行うために、継続的にカンファレンス(PyCon)を開くことを目的とした非営利組織

www.pycon.jp

pycon jp logo

PyCon JP Associationの主な活動

PyCon JP 2025

BeProud Inc. 🏢

  • BeProud: Pythonシステム開発、コンサル

  • connpass: IT勉強会支援プラットフォーム

  • PyQ: Python独学プラットフォーム

  • TRACERY: システム開発ドキュメントサービス

BeProud logos

BeProud & PyCon JP ❤️ PyCon mini 東海

PyCon mini Tokai Sponsors

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

  • ビープラウドが執筆した書籍

  • ビープラウドに新たに加わったメンバーが、プロジェクトに円滑に参加するためのガイド

    • Pythonで開発するチームに役立つはず

    • 当時の開発スタイルが見えてくる

PyPro出版の歴史 📚

PyPro出版の歴史 📚

  • 初版(PyPro): 2012年3月27日

  • 第2版(PyPro2): 2015年2月27日

  • 第3版(PyPro3): 2018年6月12日

  • 第4版(PyPro4): 2024年2月16日

どれくらい間があいたのか

>>> from datetime import date
>>> pypro = date(2012, 3, 27)
>>> pypro2 = date(2015, 2, 27)
>>> pypro3 = date(2018, 6, 12)
>>> pypro4 = date(2024, 2, 16)
>>> (pypro2 - pypro).days / 365
2.9232876712328766
>>> (pypro3 - pypro2).days / 365
3.2904109589041095
>>> (pypro4 - pypro3).days / 365
5.684931506849315

PyPro(黒)

  • 発売日: 2012年3月27日

  • 464ページ

  • 本体: 2,800円+税

pypro1

PyPro著者

  • リーダー: 清水川貴之

  • 岡野真也、池田洋介、畠弥峰、drillbits、cactusman、東健太、tell-k、今川館、ナツ、文殊堂、aita、冨田洋祐

pypro1

2012年のできごと

PyPro2(黒+赤)

  • 発売日: 2015年2月27日

  • 472ページ

  • 本体: 2,800円+税

pypro2

PyPro2著者

  • リーダー: 清水川貴之

  • 岡野真也、drillbits、cactusman、東健太、tell-k、文殊堂、冨田洋祐、aodag鈴木たかのり清原弘貴

pypro2

2015年のできごと

PyPro3(黒+青)

  • 発売日: 2018年6月12日

  • 488ページ

  • 本体: 2,800円+税

pypro3

PyPro3著者

  • リーダー: 鈴木たかのり

  • 清水川貴之、tell-k、清原弘貴、James Van Dyne的場達矢吉田花春新木雅也altnight、川村愛美、石上晋

pypro3

2018年のできごと

PyPro4(黒+緑)

  • 発売日: 2024年2月16日

  • 468ページ

  • 本体: 3,000円+税

pypro4

PyPro4著者

  • リーダー: 石上晋

  • 鈴木駿、altnight、鈴木たかのり、Yukie荻野真志、吉田花春、降籏洋行、川村愛美、的場達矢

pypro4

2024年のできごと

PyPro出版の歴史のまとめ

  • 12年間4回出版

  • メンバー入れ替えながら

  • 執筆リーダー代わりながら

pypro1 pypro2 pypro3 pypro4

章ごと改訂の歴史を見る 🆙

1. Pythonのセットアップ 🐍

PyPro3 → PyPro4

  • Python: Python 3.11

  • 開発環境: Docker / Docker Composeを採用

  • 便利なツール

    • Black: コード整形(2018年)

    • Ruff: Pythonリンター(2022年)

    • mypy: 型ヒントの静的型チェッカー

Black: コード整形

$ pip install black
$ black src/ hogehoge.py  # コードをフォーマット
$ black --check src/ hogehoge.py  # フォーマット対象があるかチェック
  • Ruff(次で紹介)に置き換わりつつある

Ruff: Pythonリンター

$ pip install ruff
$ ruff check  # 全ファイルをチェック
$ ruff check --fix  # 可能なら自動で修正
$ ruff format  # 全ファイルをフォーマット

mypy: Pythonの静的型チェッカー

  • mypy-lang.org

  • 型ヒントを元にコードに問題がないか調べる

def fib(n: int) -> Iterator[int]:
    a, b = 0, 1
    while a < n:
        yield a
        a, b = b, a+b
		
fib("a")  # mypyでエラー

PyPro2 → PyPro3

  • Python: Python 3.6.4

  • 開発環境: VirtualBox / Vagrant 上のUbuntu

    • Pythonをソースからインストール

  • 仮想環境: venv (Python 3.3以降)

  • 便利なツール: Flake8: Pythonリンター

  • バージョン管理: Gitに変更

venv: Python仮想環境

  • Python 3.3から標準

  • プロジェクト毎の仮想環境を作成できる

$ python -m venv env
$ . env/bin/activate
(env) $ pip install django
  • 今後uvに変わるかも?

PyPro1 → PyPro2

  • Python: Python 2.7.6

    • Python 3系についても触れている

  • 仮想環境: virtualenvをインストール

  • バージョン管理: Mercurialを使用

    • サーバーも自前でたてていた

    • Bitbucketも軽く紹介

PyPro

  • get-pip.py

    • pip コマンドはPythonに含まれていない

    • get-pip.py をダウンロード→インストール

PyPro

$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python get-pip.py

2. Webアプリケーション 🕸️

PyPro3 → PyPro4

  • WebアプリケーションからWeb APIへ

    • DjangoでHTML生成ではなく、APIのみ提供

    • フロントはVue.js

    • FastAPIにも軽く触れている

Django: WebApplicationフレームワーク

  • www.djangoproject.com

  • 最新バージョン: 5.1.2

  • Webアプリーケーション開発に必要な機能が揃っている

  • セキュリティ対策もされている

  • 大規模サイトでも利用されている

FastAPI: API構築用フレームワーク

  • fastapi.tiangolo.com

  • 最新バージョン: 0.115.4

  • 高速に動作

  • インタラクティブなAPIドキュメントを生成

PyPro2 → PyPro3

  • Flaskで乗りログ

    • FlaskでWebアプリ構築

    • お題は乗りログ(電車の乗車記録)

Flask: 軽量Webフレームワーク

PyPro、PyPro2

  • Flaskでゲストブック

    • フレームワークはFlask

    • お題はゲストブック

3. データサイエンス 📊

PyPro3 → PyPro4

  • 機械学習からデータサイエンスへ

    • Jupyter NotebookからJupyterLab

    • 数理最適化 を紹介

JupyterLab: ノートブック作成アプリ

  • jupyterlab.readthedocs.io

  • コードの実行結果が表示される

    • グラフ描画、画像表示等も可能

  • データ分析、機械学習等での試行に便利

PyPro3

  • 機械学習の章が初登場

  • 機械学習プロジェクトの進め方を紹介

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

PyPro3 → PyPro4

  • 複数の課題管理システムを紹介

    • Redmine、Backlog、JIRA、GitHub Projects

  • Slackの使いこなしを追加

  • ビデオ、音声会議を追加

  • Googleカレンダー1Passwordを追加

    • Dropbox、Dropbox Paperを削除

課題管理システム

  • 課題(タスク)の状況を管理するシステム

  • RedmineBacklogJIRAGitHub Projectsなど

  • いつ、誰がなにをしたか

  • 課題が完了したかどうか

  • 優先度、期日

1Password: パスワードマネージャー

  • 1password.com/jp

  • アカウント、パスワード等を安全に管理

  • グループのメンバーで共有

  • 複数デバイスで利用可能

PyPro2 → PyPro3

  • 課題管理はRedmineのみ

    • Redmineのインストールはあっさり

PyPro → PyPro2

  • Redmineのインストールはしっかり

  • Mercurialとの連携

  • チャットシステムはSlack(2013年リリース)

PyPro

  • 課題管理はTrac

    • Python製、2023年9月まで開発

  • チャットシステムはSkype

5. 課題管理とレビュー 🎫

PyPro3 → PyPro4

  • Redmineの画面イメージを削除

    • 複数の課題管理システムに対応するため

  • Backlog、Jira、GitHubでのテンプレート設定

  • チケットテンプレート例がreST→markdown

PyPro → PyPro2

  • チケットテンプレートが追加

  • コードレビューにはrietveldを使用

    • App Engine上で動くレビューツール

    • 2018年まで開発

6. ソースコード管理 🐙

PyPro3 → PyPro4

  • git swtich コマンドを紹介

  • GitのGUIクライアントの紹介を削除

    • VSCode、PyCharmのGit連携

    • GitHub CLIを紹介

GitHub CLI: コマンドラインツール

$ brew install github
$ gh issue list
$ gh pr create
$ gh pr merge

PyPro2 → PyPro3

  • Git/GitHubに変更

    • ブランチ作成

    • マージ、リベース

    • GitHub Flow

    • GitHubのTips

GitHub Flow: 軽量なワークフロー

  • ドキュメント: GitHub フロー

  • mainブランチと各機能を実装するfeatureブランチのみ

  • mainブランチにマージしてデプロイ

PyPro、PyPro2

  • Mercurialでのソースコード管理

    • サーバー上の管理と設定

    • フックの活用

    • BeProud Mercurial Workflow

7. 開発ドキュメント 📝

PyPro3 → PyPro4

PyPro〜PyPro3

  • Sphinxでドキュメント作成

Sphinx: ドキュメンテーションツール

8. 単体テスト ✅

PyPro3 → PyPro4

  • pytestと各種pytestプラグイン

  • Djangoのテストはpytest-django

  • pandasのテストとスナップショットテスト

    • 過去の実行結果を次回のテストで使う

pytest: テスト用フレームワーク

  • docs.pytest.org

  • デファクトスタンダード

  • assert文で検証

  • テストコードを自動検出

  • プラグイン機能と1300以上のプラグイン

PyPro→PyPro2、PyPro3

PyPro

9. 継続的インテグレーション 🤵‍♂️

PyPro3 → PyPro4

GitHub Actions: GitHub上のCI/CD

  • github.co.jp/features/actions

  • PRに対して自動テスト実行などで利用

  • mainにmergeすると自動デプロイなども可能

  • パブリックリポジトリは無料

  • プライベートでも2,000分/月無料

PyPro2 → PyPro3

  • CircleCIで継続的インテグレーション

    • ユニットテスト

    • 結果のSlack通知

    • Sphinxドキュメントのビルド

PyPro、PyPro2

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

    • Jenkinsのインストール

    • ユニットテスト

    • Sphinxドキュメントのビルド

10. Pythonパッケージ 📦

PyPro3 → PyPro4

  • pyproject.toml でパッケージング

    • PEP 518: 2016年提案、2020年Final

  • READMEがreSTからmarkdown

  • buildモジュールでビルド

    • python -m build コマンド

pyproject.toml: パッケージ設定

PyPro2 → PyPro3

PyPro → PyPro2

  • python setup.py register でPyPIにアップロード

  • wheel パッケージ

    • PEP 427: 2012年提案、2013年Accepted

PyPro

  • bdist_egg パッケージ

    • PEP 715: 2023年PyPIへアップロード不可

11. Webアプリの公開 📢

PyPro3 → PyPro4

PyPro → PyPro2、PyPro3

  • インフラはサーバー構成のみ

  • Ansibleでのデプロイ

PyPro

12. テスト 💯

PyPro3 → PyPro4

13. Webアプリの監視 👀

PyPro4 🆕

14. 追加開発 🏗️

PyPro4 🆕

  • endoflife.date: Djangoのライフサイクル確認

  • pip list -o : 更新ライブラリ確認

  • pipdeptree: パッケージの依存関係確認

  • Dependabot: セキュリティ問題の警告

endoflife.date: 製品のEOLを記録

  • endoflife.date

  • Djangoは2年ごとにLTSリリース、3年サポート

Django Release Roadmap

消えた内容 🫥

消えた内容

まとめ 📚

  • 12年もあると色々と変わっている

    • 大きく変わらないものもある

  • 常により良い選択に挑戦している

  • 第5版 ではなにが入れ替わるのか、楽しみ

Thank You 🙏

slides.takanory.net

@takanory takanory takanory takanory

takanory profile kuro-chan and kuri-chan