2009年04月02日 16:00 [Edit]

デバッグより重要なもの

この話題、すっかり乗り遅れてしまった。

2009-03-22 - 未来のいつか/hyoshiokの日記
プログラミング入門書では、デバッグについて、ほとんど議論されていないし、仮にふれられていても、おざなりな方法というか、かなり邪険にあつかわれていたりする。プログラマの多くの時間がデバッグについやされていたとしてもだ。

あえていわせていただく。コードはデバッグできるだけはるかにましなのだ、と。printfを使うかどうかなんぞ、その問題と比べれば屁ですらないのだと。


デバッグよりもはるかに重要なもの、それはデータ構造の選定。

ここで一歩間違えると、バグが仕様化し、デバッグどころかバグにあわせてプログラムを書かねばならぬ羽目になる。

その最も顕著な例が、Unicodeだろう。最初の設計を間違えたおかげで、最新のソフトウェアまで仕様という名のバグに引きずられる羽目になった。 Java の char はちっとも char じゃないし、JavaScript までそれに引きずられているというのはご存知のとおり。普及にこれだけ時間がかかったのも、仕様がバグっていたからだろう。そして今日もなお、Unicodeは新たなバグを生み続け、プログラマーたちは倦み続けている。

それでは、 Unicode は何を間違えたのか。

ひとえに、ひとえに、ひとえに拡張性である。「二つで充分ですよ」ならぬ「ニバイトで充分ですよ」が、すべての間違いのもとだったのだ。もはや歴史となったY2K問題も、これから歴史になるかも知れない2038年問題も、実は同根だったりする。バイナリー、すなわち固定長のフォーマットは、よほどのことがないかぎりいつか行き詰まり、そしてその日が来るのはほぼ間違いなくあなたが思っているよりも早い。

逆に成功したものと言えば、「テキストによる表現」であろう。それは電脳的には冗長で、計算コストが高い時代にはまさに「富豪プログラミング」だった。しかし、テキストの持つ無限の拡張性は、それを補ってあまりあるものだった。今ではバイナリデータさえ、テキストに「シリアライズ」されて交換するのが日常となっている。

最も成功したバイナリーフォーマットである IPv4 でさえ、拡張性の限界に達したことを思えば、「テキストでデータを表現する」ことの偉大さがわかる。

実は Unicode 、というより UTF-16というのはこの点でもクソである。一番クソだったのは折角のテキストをバイナリーにしてしまうこと。UTF-8の登場は本当に福音だった。あれは単に Unicode を符号化するという点だけではなく、32ビット(正確には31ビット;0x00000000 - 0x7fffffff)のデータを「テキスト化」する一般的な手法としても優れている。

「データ構造をどうするか」というのは、デバッグ以上に教則が確立されていない世界であり、今日のことだけではなく明日のことまで考慮に入れねばならないという点において、何にも増して難易度が高い。コンピューター言語ですら、「コードをどうデータとして表現するか」という点においてこのカテゴリーに入るのだし。

しかし、少なくとも一つは「あとで後悔しない」知恵がある。

迷ったら、テキストにしておけ。

バイナリーがいいと確信してても、テキストにしておけ。

どうしてもバイナリーが欲しかったら、テキスト化する方法も一緒に作っておけ。

Dan the Victim


この記事へのトラックバックURL

この記事へのトラックバック
プログラミングにおけるデバッグと比較する形でデータ構造の重要性についての話題。 デバッグより重要なもの|404 Blog Not Found デバッグよりもはるかに重要なもの、それはデータ構造の選定。 ここで一歩間違えると、バグが仕様化し、デバッグどころかバグにあわ...
データ構造【katyos開発室】at 2009年04月02日 22:01
プログラミングにおけるデバッグと比較する形でデータ構造の重要性についての話題。 デバッグより重要なもの|404 Blog Not Found デバッグよりもはるかに重要なもの、それはデータ構造の選定。 ここで一歩間違えると、バグが仕様化し、デバッグどころかバグにあわ...
当たり前だけど、テキストはデータ構造じゃない。【katyos開発室】at 2009年04月02日 22:02
dankogaiさんのブログ経由でこんなエントリー見つけました。2009-03-...
デバッグは大変ね(棒読み)【♪8th Note♪】at 2009年04月03日 03:30
小飼さんのデバッグより重要なものというエントリーで、下の部分を読んで、ふと、ある本の内容を思い出しました。
データ構造の重要性【Bugle Diary】at 2009年04月05日 14:37
うーむ、Wikipediaですら「見た目」の違いしか説明していない。 バイナリ - Wikipediaコンピュータが扱うすべてのデータはバイナリデータ(バイトの並び)であり、プレーンテキスト(または単にテキスト)もバイナリデータの一種ではあるが、通常バイナリとテキストは対比し...
バイナリとテキストの本当の違い【404 Blog Not Found】at 2009年04月09日 00:31
この記事へのコメント
上の記事を引く必要があったのか疑問。
Posted by m11m at 2009年04月03日 17:07
>迷ったら、テキストにしておけ。
>テキスト化する方法も一緒に作っておけ。

よ、よすぎ!
Posted by ポンピー at 2009年04月07日 11:21