「変態構文」「しつこい奴」は褒め言葉です

sumim’s smalltalking-tosから、お叱りを受けました。


逆に、これだけ Smalltalk システムや同コミュニティ由来の技術や技法が注目、あるいは、再評価される時代にあって、未だこうして Smalltalk を死んだもの、うち捨てられたものと信じて疑わない方が識者にも普通におられるということから、まだまだ我々ユーザーの伝える努力も足りていないのだな…と。w

Smalltalkが死んだもの」と考えているようでは、とても「識者」とは呼べないでしょう。(そういう皮肉なのだと思いますが)

ちょっとググってみたら、Technologic Arts Incorporated--推進技術というのがありましたので、そこから引用します。


XPのアイディアは、1980年後半にsmalltalkコミュニティにおいてKent BeckWard Cunninghamとの間で生まれていました。これがはじめて実践されたのは1996年、米国クライスラーで行われた「C3プロジェクト(Crysler payroll project)」においてでした。このプロジェクトで、Kent Beck氏はコンサルタントとしてXPを導入し、一緒に開発に携わったのがWard Cunningham、Ron Jeffries、Martin Fowlerでした。この経験を元にXPを理論的に説明した『XPエクストリーム・プログラミング入門編』をKent Beckが書き、一躍ソフトウェア業界で注目を浴びることになりました。

これくらいのことは知ってました。

ただ、こうして自分の書いたものをバリバリのSmalltalkerの方が読んでいただけるということは予想してませんでしたので、その点で普及度に関する認識が甘かったのかもしれません。

それで、説明が足りなかったと思うのは、(自分の中では)「変態構文」は褒め言葉であったということです。

Tweak: Bank Account Tutorialから引用します。

 amount > balance
ifTrue:[^self inform: 'sorry, not enough funds'].

このif文の意味がわかった時の衝撃は今でも忘れられません。Smalltalkを知らない人の為に解説しますが、Ruby風に書くとこんな感じです。

   (amount > @balance).ifTrue do
raise 'sorry, not enogh funds'
end.ifFalse do
@balance -= amount
end

amount > balance という式がひとつのブーリアンオブジェクトを生成して、そのブーリアンオブジェクト(TrueまたはFalse)に対して、ifTrue:というメッセージをブロックとともに送り、送られたオブジェクトは自分が真であれば、ブロックを実行(評価)する、ということです。

実は、amount > balance という一見式に見えるものも、amountという整数オブジェクトに ">"というメッセージを送り、大小によってTrueまたはFalseを返却するという、メッセージのやりとりの表現です。

つまり、Smalltalkにはif文のような制御構造が存在してなくて、関数呼び出しと同じようなメッセージのやりとりだけで、全ての計算が進行していくわけです。

おかしなif文のように見える記述には、そういう重要な意味が含まれていることを理解した時には、本当に感動しました。

以前ちょっとだけ取りあげことがありますがSmalltalkの底を流れる設計思想(現在アクセスできないので一応Googleキャッシュ)という文章に、そのことの意味がうまく書かれていて、私はこれに完全に同意します。そういう意味で、これがコンピュータの歴史の中で、非常に重要な意味を持つシステムであることは、言うまでもないと思っています。

ただ、これがそのまま多くのプログラマに活用され得るかどうかと言うと、そこには難しい問題があります。

例えば、1画面で1万回以上もSQL発行するJavaプログラマがいるというのが、ある種の現場の実態でもあるわけで、ありとあらゆる「抽象化」というものに抵抗があるプログラマも多いわけです。

同じマイクロソフトの製品なのに、Visual BasicとVisual C++の現場での受容のされ具合、正しい活用方法の理解され具合を比較すると、そういうことを強く感じます。

VBというシステムは、「抽象化」というものに抵抗があるプログラマの思考形態を非常によく理解して作られているように感じます。そういう点で、私はSmalltalkSchemeのような徹底した「抽象化」にも価値を感じますが、ある種の橋渡しというか、「抜かずの剣」のような「抽象化」を踏み留まったシステムにも、別の価値を感じます。

Rubyの魅力は、VBとは違う意味、違うレベルで、VBと同様の現場に受けいれられる妥協的な要素を持ちながら、徹底した「抽象化」の側面を隠し持っていることです。

例えば、上記のコードは、以下のようにすると、そのまま実行できます。

 
class Object
def ifTrue(&block)
yield
self
end

def ifFalse(&block)
self
end
end

class FalseClass
def ifTrue(&block)
self
end

def ifFalse(&block)
yield
self
end
end

class BankAccount
attr_reader :balance
def initialize
@balance = 0
end

def deposit(amount)
@balance += amount
end

def withdraw(amount)
(amount > @balance).ifTrue do
raise 'sorry, not enogh funds'
end.ifFalse do
@balance -= amount
end
end
end

acc = BankAccount.new
acc.deposit(100)
puts acc.balance # -> 100
acc.withdraw(50)
puts acc.balance #-> 50
acc.withdraw(100) # -> 'sorry, not enogh funds'

こういう可能性を隠し持ちながら、「変態」でない普通のif文を使っても書ける所に、大きな意味があると思います。

だから、そこにSmalltalkで長年つちかわれた基礎技術や開発のノウハウが使われていくのは、大きな意味があると思いますが、それは、私から見るとSmalltalkが広く活用されていくということであって、同時に、Smalltalkの価値を認めているからこそそう思うわけです。

それと「しつこい」も褒め言葉で、これは(わかりにくいとは思いますが)自分に対する褒め言葉でした。自分に対する褒め言葉でもあるので、テレがあってああいう突き離したような表現をしてしまいました。というのは、私は、ここに書いたくらいのレベルでは、Smalltalkオブジェクト指向の価値を二十年前にほぼ認識していましたが、それと目の前にある現実とのあまりのギャップに、非常に絶望的な気分でいたのです。

でも、(非常にベタな表現ですが)夢をあきらめないで、可能な選択肢の中から、少しでも自分の希望に近いことを選び続けているうちに、長い時間をかけて、ある程度は、Rubyで自分の書きたいプログラムを書けるようになっているわけです。「書ける」というのは、私が蓄積してきたノウハウと私が変えてきた自分を取り巻く環境が両方とも、20年前に夢見たことに近づいているということです。

RubySmalltalkが上記のように似ていることと、一方で非常に違う思想のシステムであることは、両方とも私の個人史の中で、重要な意味を持ちます。それが思わず「しつこい奴」という言葉になって出てしまったというわけです。

誤読されたのは、私の説明が足らなかったからだと思いますが、「変態構文」=「徹底した抽象化」も「しつこい奴」=「長年にわたるSmalltalkの活用、普及への努力」も褒め言葉です。

(4/25 追記)

下記のコメントも参考にしてください。(sumimさん、ご指摘ありがとうございます)