twitterで↓のネタを見つけました。
すみません、ダックタイピングって時々耳にしたことはあったんですが、タイピング(文字入力)方法の一種だと勘違いしていました。お恥ずかしい・・・。
Wikipediaの説明を読んで、ようやく正しい意味を理解しました。
つまり実行時型解決のことだったんですね。ええ、概念的には以前から理解していました(説得力ないけど)。
それにしても、「間違っている」とまで言い切っちゃうと変な宗教論争になってしまいそうですね。
ダックタイピングに限らず、技術や思想にはメリットとデメリットが混在していることがほとんどですから、ケースバイケースでメリットがデメリットを超える場合にその技術を採用すればいい、ってことになります。
この手の議論をするなら詳細な前提条件を付け加えておかないと、話が変な方向に進みがちです。
といっても、この質問者の方は全く的外れな議論をしているようには思えません。
現場にはダメエンジニアがごろごろいる、彼らを縛るinterfaceという鎖、この輝きが美しい。
表現が若干刺激的ですが、言いたいことはよく分かります。
つまり、コンパイル型言語は静的な型付けが基本で、冗長なコードを生みやすい。反面、ショボいミスはコンパイラが見つけてくれる。
一方、スクリプト言語は動的な型付けが基本で、短くシンプルなコードを生みやすい。反面、ショボいミスであっても実際に実行するまで分からない。
単純に言い換えると、
信頼できないプログラマ(自分自身を含む)や、意思疎通が不十分な開発チームにはコンパイル型言語がベター
信頼できるプログラマ(自分自身を含む)や、十二分に意思疎通が取れている開発チームにはスクリプト言語がベター
と表現することができます。
確かにダメなエンジニアにダックタイピングを与えると、現場にさらなる混乱を招く気がします。
まあ、それ以前にダメなエンジニアはダックタイピングを使おうとしないでしょうけど。
でもヘタに知識を持ったエンジニアが調子にのって乱用しちゃうと、かなり悲惨なことになりそうですねえ・・・(T T)
ところで、勝手に引用しちゃっていいのかどうか分かりませんが、RubyのMatz先生がtwitterで以下のような発言をしています。
ええ。でも、「プログラムが大きくなるにつれて」静的型が欲しくなるという感覚はやっぱりわかりません。RT @esumii: @yukihiro_matz Matz's Rubyの実装は(主に)C言語で書かれていて、かつ、「数千行以上」ではないでしょうか?:-)
— Yukihiro Matsumoto (@yukihiro_matz) August 23, 2010
Matz先生の場合、ご自身を含めて「信頼できるプログラマ」と開発する機会が多いからコンパイル型言語の必要性を感じないんじゃないかな〜?なんて想像したりします。
ソフトウェアハウスの最底辺なんて、それこそ「派遣PG時代の思い出*1」みたいなプログラマがうようよしていますから。
1万行のメソッドが実行するまで分からない、というんじゃ手も足も出ません・・・(> <)
まあ、コンパイラにチェックさせたって発見できる問題はたかがしれてるかもしれませんが、それでも「同じ名前のローカル変数を作っちゃった!」みたいな問題ぐらいは発見してくれそうです。
そんなわけで、ダックタイピングも現場によっては確かに有用ですが、プログラミングスキルの格差がまだまだ大きい現在の開発現場においては、静的型付け(コンパイル型)言語がまだまだ必要、と言える気がします。
2010.9.14追記
ダックタイピングのことに言及しているわけではありませんが、ダックタイピングについても同じことが言えそうなMatz先生のお言葉を見つけました。
「Rubyは君を信頼する。Rubyは君を分別のあるプログラマとして扱う。Rubyはメタプログラミングのような強力な力を与える。ただし、大いなる力には、大いなる責任が伴うことを忘れてはいけない」*2
プログラマを信頼するかわりに、強力な力を与える。そのかわりにプログラマには責任が伴う。
ちょっと極端かもしれませんが、ダックタイピングでもこれぐらいの感覚を持ったプログラマに限って使うようにした方が良いかもしれません。