
【脱初心者】 Pythonをゴリゴリ実運用したい人に送る心得
はじめに
学生時代からはや10年弱Pythonに関わり続けた私が、
ゴリゴリにPythonを実運用したい人に送る理解すべきこと集です。
(私もまだまだ若輩者ですが。)
本内容は自分自身や周囲の人々からの経験で得られた、
「実運用ではこのあたりを気をつけておくべきだな」と考えた内容です。
各節では、概要とその深堀りの書籍やWebリンクを記載しています。
この記事を目次的に活用し、深掘りは各種媒体にて理解を進めていただけますと幸いです。
基礎編
体系的な教科書的コンテンツを一通り抑える
Pythonは最低限動作し始めるまでの難易度が低い反面、「何となく」の理解で動作してしまうことが良くないポイントです。
基礎を疎かにせず、体系的な教科書的コンテンツで一通り知見を導入すべきです。
書籍・動画・Webでの学習ツールなど沢山の種類があるので、自分に合うものを選んだら良いです。
重要な基礎固めなので、無料媒体に縛られることなく、自分の理解が深まるものに積極的に課金しましょう。
私は「入門 Python 3」の書籍と、「PyQ」のWebサービスに1ヶ月だけ課金しました。
コーディング関連の名著は一通り目を通す
全プログラミング言語に共通する重要概念を一通り学んでおきましょう。
つよつよエンジニアの方々は、これらの知識が当たり前にインストールされた状態で、開発を進められている印象です。
すべてを一度に理解する必要はないですが、開発を進める中で使いどころがつかめてきます。
リーダブルコード、プリンシプル オブ プログラミング、達人プログラマー、あたりは読んでおきたいです。
何らかの統合開発環境を使いこなす
メモ帳で開発をされているそこのあなた、今すぐ卒業しましょう。
開発速度が雲泥の差で発生します。
自分のお気に入りのエディタを探して、使いこなしましょう。
Visual studio code、Sublime Text、PyCharm、何でもよいと思います。
統合開発環境を使いこなした暁には、printデバッグからは卒業しましょう。
実行、Print、実行、Print、、のループから脱出しましょう。
統合開発環境にはデバッガーがついています。
ステップインして、全変数の挙動を確認したほうが楽ですよね?
そして、ショートカットを使いこなせるようになりましょう。
カーソル移動をマウスで地道に行うのはやめましょう。
名前重要
テキトーな変数名をつけるのはやめましょう、あなたの癖として無意識的に定着する前に。
変数名や関数目から、挙動が推測できるものにしましょう。
特にPythonは動的型付けなので、変数名から型が推定できることは非常に重要です。
基本はPEP8のコーディング規約に従う
プロジェクト特有の規約がある場合はそちらにも従う
また、全く命名の案が浮かばない場合は、下記のようなネットを参考にするのも手かと。
コーディング規約を理解する
PythonにはPEP8などのコーディング規約が存在します。
そのため、理論的にはあるべきソースコードの記述は一意に決まります。
統合開発環境の場合はautopep8やflake8などを活用して、
コーディング規約違反を可視化・修正してくれるツールがあるので、積極的に活用しましょう。
テスト実装の喜びを知る
「unittest・pytest?何それ美味しいの?」から脱出しましょう。
過去に作ったコードが、いつのまにか動作しなくなりませんか?
テストを使いこなせると、不要な手戻りは減り、開発速度は10倍以上に改善することでしょう。
Pythonではpytestを活用することで、簡単にテストを実装できます。
外部通信も、大概はmockを活用することで、テスト実装可能です。
「テスト駆動Python」の書籍が圧倒的にわかりやすかったので、おすすめです。
レガシーコードからの脱却的には、「テストコードがない=レガシーコード」です。
理想的には下位の単体テストから積み上げていきたいですが、時間がない場合は上位のシステムテストだけ実装するもの手です。
コメントアウトが不要になるコーディング
コメントアウトに変数や挙動の説明を記載していないでしょうか?
コメント自体は直接挙動には影響しないため、メンテナンスされない限り陳腐化してきます。
そのため、理想的にはコメントアウトなしで挙動が理解できる実装であることが望ましいです。
そのためには、以下がおすすめです。
明瞭な命名規則
1ステップに複数の処理を組み込まず、コードの可読性を上げる
動作するドキュメントとしての、テストコードの活用
開発インフラに対する理解を深める
「Pythonが使える」≠「Pythonだけが使えるようになった」
Pythonを動作させるために必要な開発インフラの知見は一通り抑えましょう。
OS:Linux, Mac OS, Windows
CLI:shell, bash, zsh, PowerShell, コマンドプロンプト,
コード管理:Git, GitHub, Gitlab
コンテナ:docker
CI/CD:GitHub actions, CircleCI, Jenkins
パッケージ管理:pip
Python仮想環境:venv, pyenv, virtualenv
Linuxで開発を進める方は、新しいLinuxの教科書で基礎を学ぶことをおすすめします。
Linuxも知見があると、開発速度10倍!的な事が多いです。
特に、コンテナやPython仮想環境は早期に習得しましょう。
複数の開発環境を維持する上では、互いに影響を与えない方法を知ることは重要です。
また、将来企業で勤務する予定の方は、Anacondaをおすすめしません。
学生の方で便利だからとAnacondaを使用される方もいらっしゃいますが、
商用利用の関係で、使えなくなる可能性が高いので、避けましょう。
Gitはお作法含めて活用できるように
「Gitを使える」= 「Commit, Pushができる」ではないと思います。
特に初期は以下のような事柄を抑えて、変更履歴を適切に管理できるようになることが望ましいです。
1コミットの粒度の考え(1アイテム・1コミット)
Github-flowなどのブランチ戦略の理解
リポジトリ容量を圧迫しない変更対象の取捨選択
CLIインターフェイスを使いこなす
Python実行時の変数入力を、都度ハードコーディングしていませんか?
CLIインターフェイスを使いこなすことを考えましょう。
argparserやhydraを活用することで、コマンドライン引数を設定することができ、柔軟にスクリプト実行することができます。
え?複数のパラメータでスクリプト実行を行いたい?
その場合はCLI側でshell等を活用し、パラメータ入力することを検討しましょう。
Jupyter notebookの保守困難性を心得る
基礎編としては、脱初心者に向け最もお伝えしたいことです。
Jupyter notebookはライブラリ化やテストコード実装が難しいため、保守が困難であり、再利用性が低いことを心得ておきましょう。
Jupyter notebookは対話型実行環境としては便利です。
その一方、ライブラリ化やテストに不向きであり、保守が困難です。
断片化されたnotebookがファイルが溜まっていませんでしょうか?
解決策として、notebookで開発したコードは、再利用性が高いスクリプトやライブラリに書き起こし、テストコードを実装しておきましょう。
応用編
Effective Pythonを読んで興奮できるようになる
Effective Pythonのような、中級・上級者向け書籍を目を通したときに、興奮を覚えられるようになりましょう。
興奮をしたということは実践を積み、基礎を抑えた証拠です。
スクリプト言語で比較的高級言語寄りなPythonでは、
中級・上級的なテクニックは知らなくても開発は進められます。
一方で、処理速度改善などの面でテクニックを知っておくことは重要です。
パッケージ化・再利用性について学ぶ
いつも、`pip xxx`みたいなコードを実行していますよね?
自分の開発したコードも、簡単に再利用できると嬉しいですよね?
作成したコードの再利用性・保守性を考えると、Pythonのパッケージは早期に習得しましょう。
パッケージ化ができるようになると、pipでのインストール、バージョン管理、テストコードの管理などが容易になります。
以下が典型的なpythonパッケージの一例です。
パッケージ用のフォルダを作成し、以下にライブラリとなるソースコード軍を実装していきます。
テストコードは別フォルダに実装してきます。
xxx_project
| | - xxx_package
| | | - __init__.py
| | | - xxx_module.py
| | - tests
| | | - __init__.py
| | | - test_module.py
| | - setup.py
| | - setup.cfg
Pythonの公式が解説しているサイトは以下です。
日本語の解説記事では、以下がわかりやすかったです。
技術ドメインの勉強は別途行う
実装の背景となる技術ドメインの勉強は別途行いましょう。
例えば、numpyを用いた行列演算を活用したい場合は、
その土台となる技術ドメインである線形代数の勉強を行いましょう。
ROSなどを用いたロボティクスを行いたい場合は、
確率ロボティクスなどで、確率・統計を学びましょう
設定情報を合わせる
チーム開発時に各人のLinter等の設定がバラバラだと、規約がカオスになりますよね?
setup.cfgやpyproject.tomlを活用して、設定情報は合わせしょう。
静的型指定言語のように型指定を書けるように
あなたはこの変数の型がわかりますでしょうか?
型指定しておけば、一瞬でわかります。
pythonは動的型指定ではありますが、
開発効率性の観点からは、typingにて静的型指定しておくべきです。
IDEを使用していれば、型推測もしてくれるので、恩恵を享受できます。
pre-commitを活用して、割れた窓を放置しない
割れた窓理論とは、
「1枚の割られた窓ガラスをそのままにしていると、さらに割られる窓ガラスが増え、いずれ街全体が荒廃してしまう」
という意味です。
コーディングにおいても、少しの規約違反を放置していると、そこから全体に崩れていってしまいます。
そこで、pre-commitを使用して、自動チェックを行いましょう。
Gitのアクション毎に自動でコーディング規約違反やpytestのチェックを行ってくれるので、割れた窓が発生することを抑えることができます。
デザインパターンは積極的に学びつつ、導入は慎重に
デザインパターンは有用な設計を我々に提供してくれます。
そのため、デザインパターンの習得は積極的に行いましょう。
一方で、安易なデザインパターンの導入は副作用が大きい場合が。
チーム開発時には、内部の同意を得たうえでの導入を検討すべきです。
ロギングについて考える
問題がないときは静寂に、問題があるときは大音量のアラートを上げましょう。
また、print文ではなく、ロガーなどで運用しましょう
さいごに
最後まで読んでいただき、ありがとうございました。
私もまだまだ若輩者であり、不勉強な部分も多々あると思います。
今後も鋭意学習と経験を積んでいきたいと思います。
ご意見・ご質問等あれば、コメントにてよろしくお願いいたします。