Edited at

クリスマスキャロルをrubyで書いてみる

More than 1 year has passed since last update.


第1章「出会い」

「ネ、ネイティブ言語は?」

先程から左右に揺れて落ち着きのない男が、目を合わせることもなく小声で問いかける。

「え?」

話しかけられた女性は男の言葉が聞き取れなかったが、隣の席の男性が何かを話しかけてきた様子に気づき怪訝な表情を見せる。

「今、わたしに話しかけました?」

隣の席の男性とは初対面だった。

その女性は名前を瑠美(ルビィ)という。

瑠美は今日から、派遣としてこの会社にやってきて、rubyプロジェクトの開発を行うのだ。

業務説明等で席を外していたため、これが隣の白流(パル)との初めての邂逅であった。


第2章

書き出しに面食らった人、いいね入れておいてくださいね(笑)

そんなわけで、エンジニアの自己紹介はだいたい、ネイティブ言語の話になることが多いと思います。

「ネイティブはJavaです。型もインテリセンスもない言語は不安でパニック障害起こすので渡さないでください」

とか。

え? ない?

初回コミュニケーションのテンプレートとして便利なので、ぜひ使ってください。


第3章

ネイティブ言語と主張するからには、自然言語よりも得意なんだろうか。

ある意味では正しい気がするので、あながち間違っていない。

丁寧な表現に困って悩んだりシソーラスを探す手間は、プログラム言語ではほぼ不要の努力だからだ。

そんな感じで僕がネイティブと主張するrubyでどこまでやれるか、試してみましょう。


第4章「転機」

ネイティブ言語なら小説だってかけるでしょ。

というわけで季節柄「クリスマスキャロル」(ディケンズ)をお題にして小説を書いてみよう。

本体部分が

story = Novel::Story.new("A Christmas Carol")

story.configure do
cast :Scrooge do who_is.greedy; who_is.crusty; end
cast :Marley do who_is.dead; who_is.miserable; end
cast :Spirits
set :Present, when: "the day before christemas eve", at: "his house", casts: [:Scrooge, :Marley]
set :TimeTrip, when: "some periods of his life", at: "some miserable scene", casts: [:Scrooge, :Spirits]
set :Last, when: "christmas eve", at: "Fred's house", casts: [:Scrooge]
end

story.start do
scene :Present do # => It is the day before christmas eve, at his house
# => There are Scrooge who is greedy, crusty and Marlay who is dead, miserable
@scrooge.inspect # => Scrooge is greedy, crusty
@marlay.make @scrooge, :uneasy # => Marlay make Scrooge uneasy
# => Scrooge is greedy, crusty
end

scene :TimeTrip do # => It is some periods of his life, at some miserable scene
# => There are Scrooge who is greedy, crusty and Spirits
3.times do
@scrooge.become :miserable # => Scrooge is greedy, crusty
# => Scrooge is greedy, crusty
# => Scrooge is miserable
end
end

scene :Last do # => It is christmas eve, at Fred's house
# => There are Scrooge who is miserable
@scrooge.inspect # => Scrooge is miserable
@scrooge.become :calm, 100 # => Scrooge is calm
end
end

超要約でこんなふうににかけるといいなぁとコーディングを始めたものの・・・

いきなりつまづきました。

処理がない

このシナリオでコーディングしていくと、行き着く先はputsの山。

果たしてそれはrubyらしいのか?

ネイティブ言語としてQiitaにかけるのか?

例えば

class Cast

def inspect
"#{@name} is #{@temper}"
end
end

みたいなコードを書いたときに、これを出して「rubyで小説書きました」とは言えないだろうと。


第5章「プログラムがプログラムであるために(あるいはプログラマオタクの独白)」

もちろん小説はかけます。

でも面白くないです。

それっぽい名前のメソッド作ってputsして・・・

って何も面白くないし、技術的になにか出てくるものでもなかった。

多少の分岐、例えば

return if schrooge.angry?

とかを書いてもいいけど、予定調和するための分岐ってそれはプログラムの仕事ではない。

ここで図らずも僕がプログラムを好きな理由に行き着いたのだ。


  • 様々な状況に対して適切な対応を取ることができる

  • 思考を抽象化し、整理することができる

つまり小説は、プログラムができるけど意味がない、というところに躓いたわけだ。

そして、僕は意味を見つけようと様々な処理(モドキ)を作ったけど、最終的には糞だった。


第6章「僕はそれでも君が好き」

「あのね」瑠美が白流に話しかける。「わたし、来週からは別の現場なの」

二人はあれ以来、少しずつ話をするようになっていた。

なるほど白流はTDDをしていたのだろう。

ぎこちなくレッドで終わった最初の挨拶から、少しずつグリーンを増やしてきたのだ。

「そうですか。頑張ってくださいね」白流にとっては最大限の返答だった。

「その」「それで」

二人が同時に発声し、困った沈黙が流れる。

白流が促され、口を開く。

「ネイティブ言語じゃなくてもいいので、perlのことも思い出してください」


第7章「終幕」

小説を書こうとするにはプログラミング言語は不向きでした。

その理由として


  • 状況描写とかし始めると、結局どこかで文字列を生成することになる

  • 文字列を生成するくらいなら、最初から書いておけばいいじゃん

  • その無駄なことをやっている感に耐えられるのであれば小説はかける


    • しかし、耐えられる人はプログラマ向きではない(と思う)


      • プログラムが無意味になることを許容する寛容(not 傲慢)

      • ひたすら文字生成用メソッドを作り続けることに耐えられる勤勉(not 怠惰)





裏を返せば、プログラムとはどういうものなのか(どういうものに向くのか)ということになります。


  • 様々な条件が絡みあうものを、シンプルなモデルの組み合わせで表現するもの

  • コードを書いている時点で一定の結果が保証されないもの(動的な結果を必要とするもの)

つまるところ、アルゴリズムがプログラムの本質なんでしょう。

ネイティブ言語とか本気で気にしてたら、血液型性格診断みたいに胡散臭くなってしまいますね。

あくまで話題作りや、知識の確認にとどめましょう。

今後は僕も「自然言語よりrubyの方が得意」なんてうそぶくのを控えようと思います。

「人とのコミュニケーションよりコンピュータとのコミュニケーションのほうが得意」ならまだ否定されていない主張なので自由にできます。


明日は

pythonネイティブかと思いきや最近juliaに浮気中の @phigasui がブライダル関係のことについて語ってくれるようです。

言語すら一途に愛せないエンジニアがブライダルの何を語るのか!?

乞うご期待!