Pythonは「緩い」言語
Pythonが人気言語であること自体には異論はあまりないだろう。一方でPythonを仕事で使う事に対しての批判は少なからず目にする。「Python滅ぼす協会」なんてのも存在するわけで、この辺りのヘイトは相応に高そうだ。
正直Pythonへの批判、特に「緩さ」については強く共感するところだが、この「緩さ」とあらためて向き合ってみよう。
Pythonは制約が緩い
素のPythonは型が緩い。
count = 0
count = "example"
これが問題なく実行できてしまうのだから、まあ今使われている言語の中では随一の緩さではなかろうか。
でもこんな言語が様々な領域で用いられ、業務システムにも使われているのは強力なエコシステムを備えているからだ。(単に、とりあえず動くからというだけではないはず)
多くの優れたライブラリが存在するし、単純に情報が多い。
そして何より、Pythonのエコシステムには型チェッカーに代表される後付けの制約が幾つか存在しており、これらを組み合わせる事で堅牢なPythonプログラミングができる。というかこれらを使わずに書くのは無謀だと思う。
後付けの制約
- mypy&pyright
- pydantic
- ruff
- pytest
- import-linter
- VS Code
これらは普段私が使っているツールだ。VS Codeが含まれていることに違和感を持たれた方もいるかもしれないが、エディターやIDEは当然、開発を支えるエコシステムの一部である。 別にVS Codeでなくても良いけれど、とりあえず自明な内容を補完し、おかしな代入をしていたらすぐに教えてくれるエディターがなければ、私にはとてもPythonは、というよりプログラミング全般無理だ。
要するに、無駄なバグとの戦いを回避するために「自明に間違っているコードを『間違っている』と指摘してくれる仕組み」が必要で、それは様々な制約として各種言語に用意されている。 現代のPythonであれば、ツールチェーンがそれにある程度応えてくれる。
Pythonは設計思想が「緩い」
さて、ではそういった制約さえあればサステナブルなPython開発ができるのかというと、ちょっと待って欲しい。これだけならPythonはここまでネガティブに語られていないと思うのだ。
Pythonの抱える「緩さ」のもう一つの要素、それは色々な書き方が出来てしまうという点だ。
複雑で、理解に苦しむコードを書きやすい土壌がPythonには備わってしまっている。
思想の強いGo
例えばGo、Pythonと並んで好きな言語なのだが、気に入っている点の一つが例外処理や継承といった、多くの言語で採用されている機能を意図的に実装していないところだ。
軽く紹介するとGoにはtry-catchが存在しない。想定されうるエラーは全て変数で返すべきという発想だ。
Goの開発陣にはプログラミングかくあるべしという思想があって、言語仕様自体がこれを強制してくる。
こういったGoの思想はPythonからは感じられない。(match文は30年かかったが)
実際のところはわからないけれど、その時々で流行りの書き方を追加サポートし続けているといった印象を受ける。例えばポリモーフィズムの書き方にしてもABCとProtocolの2種類が存在している。
複数人で開発しようとするまでもなく、個人開発であっても一貫性の無いコーディングが出来てしまう。
業務システムをPythonで記述する事に難色を示す方々の思いは、Pythonが抱える制約の緩さと設計思想の緩さの2点、それによる品質の担保が難しいという点に尽きるのではないだろうか。
ただ、裏を返せばPythonという言語は我々の書きたい書き方を大体許容してくれる言語でもある。
難しい話ではあるが、開発者全員が保守性の高いプログラムを書こうと意識し、その方法論を共通認識として持っていれば、Pythonでも業務システムは書けるはずだ。
結局、強くなるしかない
タイトルに立ち返ろう。サステナブルなPythonソフトウェアを作るにはどうすればいいのか?Pythonが持つ制約と設計思想の2つの「緩さ」を乗り越える必要がある。前者であれば各種ツールを適切に利用することであり、後者であれば優れた設計論に基づくコードを書くことだ。
Pythonでプログラミングをするのは、なんとも難しいものである。
雑談
ブラックフライデーが終わりましたね。今年は色々と買い込んでしまったんですが、特に昇降式デスクがアツいです。でも組み立てる暇が中々無い……