2012年6月23日土曜日

動的言語で、生産性が上がる、ってどういうことだろう

久しぶりに読んでみたらおもしろかったので
http://logsoku.com/thread/hibari.2ch.net/tech/1308499587/
また考えてみます。

まず「動的言語」ってなんなの?という定義が必要だと思われます。
この系列の初回のスレッドでは、

http://logsoku.com/thread/hibari.2ch.net/tech/1306002146/

1 : デフォルトの名無しさん : 2011/05/22(日) 03:22:26.61
型をしっかり明記してこそ
安全で堅牢、バグのないソフトは作れる
と言ってるので、まずは「動的型付け言語」だと解釈するべきだと思うのだがどうか?小生もこの点では激しく同意します。一番困るのは、関数の引数の順序間違いとか入れ違い。

悪名高きPHP5でも、引数型のタイプヒンティングが付きました。ただしこれ、arrayもしくはクラス/インターフェイスに限ります。stringとかintとかboolとかは書けないわけです、片手落ちとはこのことかと。PHPでこれを使うなら、クラス名を直接書くより、interfaceをわざわざ宣言して、わざわざ指定するべきでしょう。こうすれば、PHPでも、「コンパイル時チェック」の恩恵を若干受けることができます。

ただし、C++育ちの人は、引数を沢山渡したがる気がするのだがどうだろう?4つ以上なんか、もう管理しきれませんよ。3つ以下に減らしましょうよ。protectedに仮置きするなりして。

「コンパイラ時チェック」には、もちろん関数名のタイプミス程度のダサイミスも含みます。だだしコレを理由にPHPをdisってる人は、統合エディタを使ってなかったりする。んじゃないかと思うのだがどうだろう?使用言語に限らず、統合エディタが手伝ってくれるものは素直に手伝ってもらいましょう。変数名だの勘数名だの補完。2画面開いてコピペとか、地道過ぎだし、JavaだったらEclipseを、Visual C++だったらVisual Studioを使ってるでしょう?その時点で、実は公平な比較をしてない。

で、ボチボチ「動的言語」の定義を「evalできる言語」にシフトしたいのですが。言い換えると、ランタイムコンパイル言語。

リファクタリング論まで含めると、Java+Eclipseが素晴らしい!なんて話に成りがちですが、その作業のほとんどをEclipseが肩代わりしてくれてることを忘れちゃいけません。Javaが素晴らしいわけではない。Eclipseが素晴らしいのです。つまりJava+Eclipseでようやく実用になる。生エディタでなんとなく仕事ができてしまう「動的言語」とは勝負になりません。※Javaが負けだと言っています。

動的言語のいいところは、コンパイル操作が要らないところ。もちろん最近は「スクリプト言語」でも内部ではバイトコンパイルしてますが、そんなミクロな話はしてません。「makeが要らない」と言い換えてもいい。これによって、「試行錯誤」を高回転で実施できるところです。

PHPのバグの殆どが「実行しないと判らない」のは全面的に認めるとして、しかし「デバッグができない/面倒臭い/困難」なわけではありません。JavaとかC++育ちの方々は、ステップトレースしたいところでしょうが、そんなミクロなデバッグは要りません。アチコチにvar_dumpを入れまくってアタリを付ける感じは嫌いじゃないですね。そして初級プログラマほどソレを勧めたい。
  • プログラムのバグってのは、1行単位で起こるわけではありません。
  • ある程度のプログラム量を経由して起こるものです。
そんなわけで、小生の見解として、
  • 動的言語で、コーディング時点でバグを検出しにくいのは仕方ない。諦めれ。
  • デバッグは、var_dumpなり、error_log( json_encode() )なりを入れまくれ。
    • 組み込み関数がダサイPHPは、自家製関数でwrapしてやればよかろう。
  • 関数の引数が4個以上とかは、引数クラス型チェックに頼るより、設計を見直す方が先。
  • PHPでは、interfaceを上手く使えば、ダサイタイプミスは減らせる。と思う。やらずに済んでるので。
  • JavaとPHPの生産性は、実は大して変わらない。
      • これは「PHPはJavaの劣化コピーだ」と思ってる人に言ってます。
      • 嘘だとおもったら、Eclipse禁止でJavaで仕事をしてみればいい。
      • ちなみに小生は、どっちも「生産性が高い」とは思ってません。
  • 本当はPythonで仕事したい。
  • 「プログラミングとは、言語を拡張することだ」と何某かの言語の開発者の誰かさんが言ってましたが、この観点からいうと、言語はシンプルな程優れてる、ということになる。tcl最強じゃね?(lispとか知りません)
  • 静的型付けマンセーだと思ってる方々には、Pike( http://ja.wikipedia.org/wiki/Pike ) とかイイと思いますよ。
要するに、「動的言語を使う」なら「動的言語なりの手抜き」をしないと、効率なんか上らんぞ。と。