修正が利用者を壊すとき
この Part の最後の発見は四つのツールのどれの中でもなかった。それは自傷だった:言語がコマンドライン引数を報せる仕方への小さく正しい修正が、言語で書かれたプログラムを静かに壊した —— しかもただのプログラムでなく、言語自身のドキュメントを公開するまさにその site generator を。ドキュメントサイト全体が 404 になり、誰かがページを訪れて気づくまで壊れたままだった。これは逆走する dogfood ループで、この Part の実の締めの教訓だ。
この Part の最後の発見は四つのツールのどれの中でもなかった。それは言語自身の中にあり、最悪の発見が 来る仕方で来た —— 失敗するテストとしてでなく、人が頼っていた何かが動かなくなった、という外の世界 からの報告として。ドキュメントサイトが自分のページの一つに 404 を返していた。コンパイラのテスト スイートで赤になったものは何もない;サイトは単に、静かに、数リリース前からページを建てるのをやめて おり、リンクが辿られて空で返るまで誰も見ていなかった。
小さく正しい修正
原因は、それ自体の観点では完全に正しかった変更に遡った。この run の先の方で、小さな片づけの一群の 中で、プログラムがコマンドライン引数を読む仕方が一貫化された:プログラムが受け取るリストはユーザが 打った引数を含むべきで、それ以外は何も含まない。修正前はそれが一貫性なくスクリプト自身のパスを最初の 要素として含んでおり、それは引数を読む全プログラムにぎこちない補償の一歩を負わせる類の小さな疣だ。 それを除くのは正しかった —— 言語をより清潔にし、あらゆる将来のプログラムをより単純にした。修正に悪い ところは何もなかった。それこそがこの話を語るに値させるものだ:損害はバグから来たのでない。実の プログラムが既にそれに頼って書かれていた振る舞いを、正しく変えたことから来た。
古い疣に頼っていたプログラム
問題のプログラムは site generator —— それ自身言語で書かれ、それ自身先の Part の dogfood —— ドキュメント のソースファイルを公開された website に変えるツールだった。それは二つの引数を読んだ:入力ディレクトリ と出力ディレクトリ。だがそれは引数リストがまだスクリプトパスで始まっていた頃に書かれたので、入力 ディレクトリを読む前にその最初の要素を注意深く飛ばしていた。修正がスクリプトパスを除くと、その 注意深い飛ばしは代わりに実の引数を飛ばし始めた:generator は出力ディレクトリを入力であるかのように 読み、ソースファイルを一つも持たないフォルダに探しに行き、変換すべきページをゼロ見つけ、内容ページの 無いサイトを書き出した。クラッシュしなかった。エラーを印字しなかった。サイトを建てたと報告し、実際 建てた —— 空のを。古い振る舞いに対し正しかった補償の一歩が新しいそれに対しバグになり、そして壊れる でなく何も見つけないことで失敗したので、それを告げるものは何もなかった。
なぜ何も捕まえなかったか
これを止めるべきで止めなかったあらゆる層について正直であるに値する。コンパイラのテストは全て通った、 なぜならそれらはコンパイラをテストし、それで建てられたプログラムをテストしないから。site generator に は、それを端から端まで走らせ出力が実際にページを含むか確かめるテストが無かった。デプロイのパイプライン はサイトを再ビルドし公開したが、ページ数がゼロに崩れたことに気づかなかった、なぜなら「ビルドは成功 した」と「ビルドは何かを産んだ」は別の主張で、確かめられていたのは最初のだけだったから。これらの 各々は Part の先の教訓と同じ形だ:プログラムは自分自身の形が触れる痛みしか surface できず、そしてこれ に触れる形 —— 下流のプログラムを端から端まで走らせ、その実の出力を主張する —— を誰も書いていなかった。 gap は今回は言語の中でなかった;それは言語とそれに頼るプログラムの間の空間にあり、それを見ている ものは何も無かった。
dogfood ループ、逆走する
このプロジェクトの方法全体には一つの方向が組み込まれている:実のプログラムを建て、それに痛ませ、修正を 言語へ上流に押し上げ、あらゆるプログラムが益を得る。この発見はその同じ流れが逆に走ったものだった。 言語の上流の変更が、古い振る舞いに対し書かれたプログラムへ下流に流れ、それを壊した —— 静かに、なぜなら 壊れは不在の形を取ったから。それは dogfooding の報酬に束ねて付いてくるリスクだ:いったん実の プログラムが言語に頼ると、言語はもう真空の中で変えられず、そして「単独で正しい」は「既に書かれた全て にとって安全」と同じでない。報酬はリスクに値する —— 言語全体が実の利用者を持つことでより強く、その 利用者が自分自身のツールであってさえ —— が、リスクは実で、修正が正しいからタダだと装うことが、空の website を ship する仕方だ。
即座の修理は小さかった:generator に、最初の引数は今や入力ディレクトリで飛ばしは要らない、と教える、 そしてサイトは再びページを建て、あらゆるドキュメントページが応えた。だが修理は要点でない。要点は失敗 の形だ —— 正しい変更、静かな壊れ、誰も端から端までテストしていなかった下流のプログラム、死んだリンクを 辿る人によってだけ見つかった —— そしてそれは、言語が問題ないと確認するのをやめどこが問題かを探しに 行くと決めることで始まった Part の、ふさわしい締めだ。この Part のツールは前もって選ばれた場所で痛む よう建てられた。この最後の痛みは選ばれなかった;それは言語の育つ表面積が送り返した最初の請求書だった。 その請求書はプロジェクトが到達した最も真の徴だ:それは、言語を変えることが帰結を持つほど、ついに十分な ものが言語で建てられた、を意味する —— それはこのものが実だ、と言う別の言い方だ。