ドキュメントもまた dogfood だった
言語コアが forcing pain を生まなくなった後、仕事は言語をより capable にすることから、legible にすることへ移った —— なぜなら誰も見つけられない feature は存在しない feature で、作者自身が自分の構文を見落としたからだ。最初の成果物は言語全体を一目で見せる Tour だった。だがより深い一手は、ドキュメントサイトが言語自身の static site generator で建てられていること —— だから docs を書くことがそれを生んだツールの dogfood になり、その dogfood が実の欠けた構文を surface した —— 可能な限り小さな一周でループを閉じて。
言語をより capable にすることが最高価値の仕事でなくなる地点が来る。前の Part の probe がまさにその 評決に達していた:コアは成熟し、さらに掘っても変更を強いるほど鋭い痛みは出なかった。だから重心が 移った —— 言語を建てることから、それを使える・読めるようにすることへ。移行のきっかけは少し きまり悪かった。連載の前のほうで、作者はある言語 feature に手を伸ばし、一瞬それが存在するのを忘れた —— 自分自身の list リテラル構文を見落とした —— それは実の原則の、小さく正直な実演だ:見つけられない feature は、実用上あらゆる点で、そこにない feature だ。次の仕事は発見性で、その最初の成果物は tour だった。
検証された tour
リファレンスドキュメントはすでに徹底し、チュートリアルはすでに丁寧だったが、そのどちらも新参者に言語 全体を素早く見せなかった。リファレンスは設計上網羅的だ;チュートリアルは手順の連なりだ。欠けていたのは Go コミュニティが馴染ませた形 —— すべてを一度に見せる一つのページ、各 feature をそれを実演する最小の 例で。だから tour が書かれた:式と curried 関数、相互再帰、代数的データ型とマッチ、record、list リテラルと内包表記とパターン、tuple、文字列と補間、前の Part からの構造的な描画と JSON と等価、module と import、capability effect —— 言語を一目で、そしてページの各例は何一つ願望でないよう先に interpreter を通して走らせた。tour は必要とするには奇妙なドキュメントだ、なぜなら決意した読者がリファレンスから 組み立てられないことは何も教えないから。だがそれは、学べる言語と見える言語との違いで、見えることが 先に来る。
言語自身のツールで docs を書く
この Part を家事以上にした一手は、ドキュメントサイトが既製のツールで建てられていないことだ。それは Mere で書かれた static site generator、言語自身のライブラリ集の一部、で建てられていて、Markdown の ディレクトリを HTML ページ群に変える。だからドキュメントを生むことは、避けようもなく、その generator の dogfood だった —— docs の各ページが、その docs の記述する言語で書かれたプログラムを通して走る。サイトは curated な順序を得て、ページをアルファベット順に並べるでなくセクションにグループ化し、各ページを ファイル名でなく実のタイトルの下に見せ、そして —— 時間をかけて効く小さな配慮 —— カタログ化されて いないページを自動的に末尾に付け足す安全網を得た、だから新しく書かれたドキュメントが順序で忘れられて サイトから静かに消えることは決してない。
ツールが、使われたときに見つけたもの
本気で使われることがツールを正直にし、generator は即座に自分自身について報告した。いくつかの ライブラリファイルが、import されると実演コードを走らせ標準出力に print した —— 他のライブラリで 以前に捕まえて直され、これらで静かに再発したパターン。import するとデモを走らせるファイルはライブラリ でない;ライブラリの服を着たスクリプトで、その出力がサイトビルドの途中に招かれず現れた。それらは定義 だけに切り詰められた。より小さなこと:文字列補間が数を自動で描画せず、文字列に差し込まれる値は明示的に テキストに変える必要があった。これらのそれぞれはレビューでなく使用によって見つかり、それが唯一それらの 見つかりえた場所だ。
カンマ、そして可能な限り小さなループ
最も鋭い発見は最も小さかった。サイト generator 自身のソースを書くことが欠けた構文にぶつかった:list か tuple の最後の要素の後のトレイリングカンマ —— 次の行を足すのが一行の変更になるよう残しておくカンマ —— が parser に拒まれた。papercut だが、実のコードを書く人が絶えず出会う類の papercut で、実のコードが 書かれるまで見えなかった。parser はそれを受け入れるよう教えられ、それは二分岐の変更と判明し、そして 設計がすでに一貫していたという心地よい確認として、record はずっとトレイリングカンマを受け入れていた。 これは dogfood ループの最もきついもの:プログラムが書かれ、その書くことが摩擦に出会い、摩擦が言語の中の 修正になり、修正が ship する —— ただしここで書かれていたプログラムはドキュメントサイトで、一周まるごとが ほぼ一度に閉じた。ループは壮大なアプリケーションを要さない。言語について、言語で書くことが、それを 改善するのに十分だった。
自分自身の玄関
最後の一片は技術的でなかったが重要だった:サイトが自分自身の名前へ、ホストの共有アドレスの下の プロジェクトパスでなくまっとうなドメインへ移り、古いアドレスが新しいものへリダイレクトし、だから既存の リンクは一つも壊れない。ビルドは対話的な playground ページを各デプロイの一部として再生成するので、 ブラウザの中のコンパイラのデモがコンパイラ自身と歩調を合わせ続ける。存在まるごとを内部プロジェクトとして 過ごしてきた言語が、いまや玄関を持った —— 訪問者をまず tour に向ける landing ページ、意図された順序の ドキュメント集、そして実際に声に出して言えるアドレス。
このどれも言語をより強力にしなかった、そしてそれが要点だった。それは言語を届くようにした、それは 違う軸で、この段階では、より価値ある軸だ。そしてそうしたのは、それ以前のすべてと同じ規律の中に留まり ながら:docs は言語自身のツールで建てられたので、docs を改善することと言語を改善することが同じ活動だと 判明した、一つのループ、一度に一つのカンマで閉じられる。