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.


