本番で使われない「Python」「Ruby」
「Python」や「Ruby」言語ほど充実したライブラリやフレームワークに恵まれている言語は珍しいでしょう。初学者は「Python」「Ruby」からプログラミングのイロハを学んだ方も多くいらっしゃると思います。
その知名度の割に本番システムでは、相変わらず
「JAVA」や「C#」や「C++」で実装されています。
著名な方達が大規模システムでは「Python」より「JAVA」を使って実装されていることが多い事を示唆されておりました。
何故、本気のシステム開発で「Python」「Ruby」の使用ができないか?
それは 「静的型付け言語」であるか否か にかかっていると断言できます。
「Effective Python Pythonプログラムを改良する90項目」の最後の90項目に
「バグを回避するために静的解析を検討する」
が申し訳なさそうに、書籍の最後を締めくくっています。
「Python」「Ruby」を始めとしたスクリプト言語は、誕生から型システムからの呪縛から逃れ自由を謳歌し、今やメインストリームの中心であるとも言えるほど人気を博していますが、その動的型付け言語に、型システムの需要が高まっています。
ちなみにRuby言語はバージョン3.0で型システムが導入されました。
※まだ rails とは too much みたいです。
型システムをベースにその恩恵を受けている
「オブジェクト指向プログラミング」
「デザインパターン」
などの手法が「Python」や「Ruby」の世界において、その技法が足元から崩れる様を具体的なプログラミングコードでお伝えします。
class Animal(object):
def cry(self):
print('Not defined')
class Dog(Animal):
def cry(self):
print('bow-wow')
class Cat(Animal):
def cry(self):
print('meow')
class people(): #Amimalのサブクラスではありません
def run(self):
print("にゃー")
def run(animal):
animal.cry()
run(Cat())
run(Animal())
run(people()) #問題がなく実行できます。
親クラスである「Animal」と、親子関係を持っていない「people」が普通にrunメソッド実行が出来ています。「JAVA」や「C#」などの「静的型付け言語」出身者からすれば、非常に違和感を持ってしまいます。
それはなぜか、「Python」や「Ruby」等の言語は 「ダックタイピング」 が許されているからなのです。
"If it walks like a duck and quacks like a duck, it must be a duck"
(もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルに違いない)
人間が「にゃー」と鳴くと「Animal」一派と判断され、処理の実行が許されています。
「JAVA」や「C#」などの「静的型付け言語」では、親子関係のない抽象型への代入ができずビルドエラーとなります。
新人エンジニアは、基本構文を覚えた後の スキルアップの線状に「オブジェクト指向プログラミング」「デザインパターン」が存在しているのは至極当然のことで、新人は先輩からこれらの技術の習得をそれとなく進められているはずです。
ただ、ダックタイピングのが許される「Python」や「Ruby」等のプログラミング言語の世界しか知らない者にとっては、その恩恵を感じられない技法となっています。
デザインパターンを「Python」や「Ruby」で解説されている方がいらっしゃいますが、そもそも成立していない。
「Effective Python」ではプログラムコード中にメタ情報を追記して、ツールを使った型チェックを行うことを推奨しています。
強制力を伴わない型システムは、開発現場での運用でカバーしましょうということでしょうが、大規模システム開発の現場にとっては、明確な責任領域が設けられており「JAVA」や「C#」で担保されていた実装上の制約事項を、強制力を何ら持たない言語に負わせる事などできましょうか?
具体的な例で申し上げると「A社担当の○○パッケージの○○クラスを利用したい場合は、○○インターフェースを実装し○○メソッドに渡してください。」という制約を、共同開発しているB社が守ってくれる保証はありません。
「Python」や「Ruby」しか知らない新人エンジニアに、深く考えず「オブジェクト指向プログラミング」「デザインパターン」の学習を薦めても、
「いったい何が・・・ありがたいのだろうか?・・・・」
とモチベージョンを保てないでしょう。
「Python」や「Ruby」の言語に、「静的型付け言語」の土台があって生まれてきた技法を求めることが、そもそも筋違いというものでしょう。
大規模システム開発を支えるクールなアイデアが「Python」や「Ruby」に盛り込まれることを切に願っています。
普段は、下記ブログでソフトウェア開発のベストプラクティスを追求しています。
よろしくお願いいたします。
Discussion
peopleクラスでもcryメソッドを実装しないといけないのでは