メインコンテンツへスキップ

プログラミングで最も難しい問題は邪悪なニガーの誘惑に抵抗すること - Terry Davisが語るソフトウェア開発

·
カテゴリー Linuxシステム FOSSをめぐる問題
タグ TempleOS
目次

Terry Davis - The Hardest Question In Programming

これはGoogleの面接で聞かれる問題だ。 あなたは答えなければならない。

文字起こし翻訳
#

あなたは答えなければならない:これは邪悪なニガーの誘惑なのか、それとも神の聖なる知恵なのか?

これが私の問題だ。ええと、私が言うのはここまでだ。残りはあなたが答えてくれ。

Googleが面接で問題を出すのは知っているだろう。そして私が仕事で遭遇した問題はこれだ:これは邪悪なニガーの誘惑なのか?

これは私たちのミッションステートメントにとって、あまりにも黒魔術すぎるのではないか?私たちがこのシステムを開発する使命は、現代版のCommodore 64になることだ。

これは黒魔術なのか?これは……これは……これは黒魔術だ。

問題はこうだ:これは黒魔術なのか?これはプログラミングで遭遇しうる最も困難な問題だ。

ここで、これこそが最も難しい問題だ。これこそがプログラミングにおける最も難しい問題だ。

未来十世紀の神殿にとって、これは黒魔術が多すぎるのではないか?

(造語のniggerliciousとvoodooをどう翻訳すればよいかわからなかった。Googleはこれを「邪惡尼哥在誘惑你」と提案したので、私はそれを採用した)

解釈
#

以上のTerry Davisによる意味不明な発言について、こういう意味だと考える人もいる:あなたのコードは複雑すぎて、もともとの目的を達成できなくなっていないか、未来の人が読んでも理解できないのではないか。

(注意:この記事のタイトルはやや誇張して改変している。この言葉はTerry Davisの直接の意味ではない)

私たちはプログラムを書くとき、物事を複雑化しないよう注意すべきであり、使うなら最も単純な解決策を使うべきだ。

動画の中で、Terry Davisが解いている問題はHolyCのループである。

彼の目標は、一つのforループの中でswitch文を使って数字を印字することだ。ただし特殊な要求が一つある:数字3から6の区間の前後に括弧[]を付ける必要がある。

期待される出力結果は、このようなものになるはずだ:

0 1 2 [ 3 4 5 6 ] 7 8 9

彼がこの例を出したのは、動画中のコードでこのように書こうとしていたからだ:

switch [i] {
    case 0: ... break;
    case 1: ... break;
    case 2: ... break;
    start:       // ラベル
       '[';      // 彼は case 3 に入る前に左括弧を出力したい
    case 3: ... break;
    case 4: ... break;
    case 5: ... break;
    case 6: ... break;
    end:         // ラベル
       ']';      // 彼は case 6 の終了後に右括弧を出力したい
       break;
    case 7: ...
}

問題は、switchの底層動作メカニズムがC言語底層の分岐表(Jump Table)の動作問題に関わっていることだ。iが3に等しいとき、プログラムは直接case 3のメモリアドレスへジャンプする。これは、case 3の上に書かれたコードがスキップされることを意味する。CPUはそこを通過せず、直接case 3へ向かう。このcaseの間に挟まれたコードは、C言語のロジックではDead Codeと呼ばれる。非常に汚いgoto命令を使わないかぎり、そこへ行くことはできない。

一般的に、数字3から6の区間の前後に括弧[]を付ける機能を実現するなら、多くのプログラマーは大量のif (i==3) print("[")を書くか、ループを分割するだろう。しかしTerry Davisは、それがswitch文の対称性と簡潔性を破壊すると考えた。

さらに彼が考えていたのは、システムのコンパイラをどのように実装すれば、この一見単純な論理問題を解決できるのかということだ。なぜコードが人間の直感で見る論理と、機械が実際に動作する結果は異なるのか?括弧を出力する順序の問題を解決するだけのために、コンパイラの底層を変更し、物事をより複雑にしなければならないのか。

したがって、動画中のこの長々としたあれこれは、実際にはプログラミング原則の問題を指している。

Terry DavisはTempleOSを開発していたとき、ソフトウェアコードの簡潔さの重要性をずっと強調していた。未来の人が理解できるようにするためだ。彼にはもう一つ有名な言葉がある:

An idiot admires complexity, a genius admires simplicity.

関連記事


最後までお読みいただきありがとうございます。本サイトでは公開コメント欄を設けていません。私はソーシャルな反応やアクセス数を追い求めるためではなく、自分の考えを誠実に探求するために文章を書いています。記事を丁寧にお読みいただいたうえで、ご感想やご意見をお寄せいただければ幸いです。誤字・誤り・技術的な問題などを見つけた場合、またはフィードバックを共有したい場合は、Aboutページに記載しているメールアドレスまでお気軽にご連絡ください。