世界を動かす技術を、日本語で。

初心者の私が、あなたが私のために書いたチュートリアルをどのように読んだか

概要

  • 開発者が SnarfusHoobijag などのツール・言語経験を紹介
  • Snarfus を使ったチュートリアルの導入と経緯説明
  • 技術的な課題と 独自の解決策 を共有
  • 実際のセットアップ手順を 端的に解説
  • コミュニティへの感謝 とユーモアを交えた締めくくり

開発者のバックグラウンドと経験

  • HoobijagjabbernocksABCDE++++ での開発経験
  • ABCDE+/^+ は絶対に使わないというこだわり
  • Shoobababoo や時折 kleptomitrons も利用
  • Company1 での Shoobaboo 関連業務経験
  • Snarfus との出会いと興味の発展

Snarfusチュートリアルの導入と発見

  • 最初は Very Simple Thing2 でSnarfusを使い始める
  • chromus の複雑さにもかかわらず多用途性を実感
  • argyling the pintafore with the quagmire という独自アプローチ
  • hoobastank を使わない選択
  • 新しい方法が意外とうまくいき、楽しさを感じる

技術的課題と解決策

  • fisterfunkshamrock portalSnarfus と通信しない問題発生
  • hoob-tunnelgramelions で詰まるトラブル
  • 諦めかけたが、 Snarfus stagnatorshamrock Klingon troglodyte emulater の接続で解決
  • すべてが正常に動作し、最終的な目的を達成

Snarfusセットアップ手順

  • ターミナルで ajkl;gawgor;iqeg;iJLkqen などのコマンド入力
  • folder/hidden/deep/in/the/file/system/surprise!.file の内容コピー
    • ファイルが見つからなければ、さらに深いパスを探索
  • ターミナルでファイル内容を貼り付け、 64A786AGR45JAR などのコマンド実行
  • Snarfus を開き、作成したファイルをアップロード
  • オプションで chronostatiomatrix のデシャム操作も可能
  • これでセットアップ完了

コミュニティへの感謝とまとめ

  • GewGawGammaometer2.7 での応用例への興味
  • チュートリアル作者や知識共有者への感謝の気持ち
  • ユーモアを交えた温かい締めくくり
  • 複雑な手順でも達成感を楽しむ姿勢

Hackerたちの意見

ほとんどのチュートリアルは非開発者向けじゃなくて、エコシステム内の他の開発者向けなんだよね。一般向けのポップサイエンスの本や番組というより、学術論文みたいな感じ。これで全然いいし、むしろ素晴らしい!同じ仲間として、そういうチュートリアルからすごく助けられてる。時には、自分が何年も前に書いた忘れ去られたメモからもね。だから、コースや他の構造化された学習教材が存在するんだよ。初心者は、ゆっくりと積み上げられた文脈の中で育てられなきゃいけない。もしすべての記事が最初から始まらなきゃならなかったら、面白いことには決してたどり着けないよ。30,000語の前置きの後にやっと面白い部分にたどり着いた頃には、読者はもういなくなってるだろうし。次の読者は、30,000語じゃトピックの紹介としては足りないって文句を言うだろうね。40,000語が必要だって。

ほとんどのチュートリアルは非開発者向けじゃなくて、エコシステム内の他の開発者向けなんだよね。今のチュートリアルって、他の開発者を助けるためというより、自分の履歴書や四半期の評価に「公に貢献した」って書くためのものって感じだよね。もし元の著者が3ヶ月後に戻ってきて、自分の指示を再確認してくれたらもっと良くなると思う。そうすれば、彼らが見落としてた小さなことに気づくはずだから。

「ほとんどのチュートリアルは非開発者向けじゃない」ってコメントで何度も繰り返されてるけど、見出し自体がこのチュートリアルも非開発者向けだと言ってるんだよね。著者が単にインストールしたかっただけのオープンソースのGithubプロジェクトみたいなもので、コードに手を加えようとしているわけじゃない。基本的には、インストールのREADMEについて皮肉を込めて文句を言ってる感じで、もっと簡単にできるようにして、非開発者も簡単なステップを踏めるようにしてほしいってこと。これは、私が開発者であっても非常に同意できる不満だよ。でも、しばしば小さなステップが省かれてしまって、慣れていない分野でそれが起こると、たくさんの時間を無駄にすることになるんだ。

初心者は、ゆっくりと積み上げられた文脈の中で育てられなきゃいけない。うちの息子は17歳で、プログラミングにすごく興味があるんだ。先日、パブリック、プライベート、内部、そしてスタティックについて説明しなきゃいけなかった。で、冗談で「明日、先生に再帰について聞いてみなよ」って言ったんだ。今週末は母親と一緒にいるけど、その後どうなったか聞くのが楽しみだよ。

初心者は、徐々に積み上げられる多くの文脈で育てられる必要がある。そう思うし、そういう人たち向けに書く時は、詳細に書いて、彼らがついていけるようなストーリーを作るようにしてる。でも、DXをスムーズにしようとする試みには不満がある。多くのプロジェクトがやってるけど、結局は絶対的な初心者にしか役立たないものになってる。ログが簡単にアクセスできなかったり、欠けていたりする。エラーを見つけるために切り貼りしたりgrepしたりするのも簡単じゃない。要するに、人々が物事を理解するために使ってきたツールやテクニックが、DXを良くする名目で貧弱な代替品に置き換えられている。これは良い傾向だとは思えない。

過去数十年にわたって指導してきた人たちに教えようとしてきたことの一つは、「共有することは、仮定することよりも良い」という原則だよ。何かを知っているなら、それを他の人と共有しよう。彼らが何かを知っているだろうと仮定しないで。もし彼らが知っていて、あなたが教えたら、それはただ彼らが既に知っていることを確認しただけ。もし彼らが知らなかったら、あなたは彼らを大いに助けて、物事をもっとアクセスしやすくしている。時々、人々は「長すぎる」とか「必要ない詳細を追加してる」と文句を言うけど、その場合は「これは[ジュニア|マネージャー|顧客]が見るかもしれないから」と言えばいい。人々は、説明が他の人のためだと褒められるのは気にしないよ。これは開発だけじゃなくて、投資報告や人材管理、納品管理にも当てはまる。

もし彼らが知っていて、あなたが教えたら、それはただ彼らが既に知っていることを確認しただけ。必ずしもそうとは限らないよ。これだと「マンプレイニング」って非難されるリスクがあるし、最近ではその定義も広がってる。さらに、あなたが「知ったかぶり」と思われるリスクもある。オフィスの人間関係に関しては、同僚にあなたに明確に説明してもらう負担をかける方がずっと安全だよ。

何かを既に知っていると言われると、驚くほど敵対的になる人に何人か出会ったことがある。具体的な例は今思い出せないけど、自分も以前はそう感じたことがあると思う。共有することが、仮定することよりも良いと考えるのは、局所的な最適解だけを考えた場合だけど、信号対雑音比が悪すぎると、もっと選択的であれば存在しなかったコミュニケーションの障害に直面することになるよ。

過去数十年にわたって指導してきた人たちに教えようとしてきたことの一つは、「共有することは、仮定することよりも良い」という原則です。何かを知っているなら、他の人と共有しましょう。原則としては完全に同意するよ。息子と僕は競技でビリヤードをしているんだけど、上達するにつれて、ほとんど誰もヒントを教えてくれないんだ。すごく競争が激しいからね。僕は彼にそれ以上のことを教えようとしていて、みんなが成長を助け合う素晴らしいリーグチームがあるんだ。指導(ただの教えることではなく)では、彼らが探している答えにたどり着くための質問をするように導くのが好きなんだ。彼らの頭の中のつながりが光る瞬間は、本当に素晴らしいよ。

ほとんどの技術ライター(一般的なコミュニケーターも)は、知識の呪いを十分に理解していないんだ。これを思い出すのは、ティーンエイジャーの頃にWorld of WarCraftのギルドを運営していた時だね。週に3〜4回「レイド」を組織してた。世界中のギルドメンバー40人が同時にサインインして、ダンジョンの中でドラゴンや他のモンスターと戦うんだ。ゲームでこんなに楽しいことはなかったけど、同時に教育的でもあった。戦いはすごく難しくて、たくさんの調整や戦略が必要で、小さなミスでも全員が死んじゃうことがあったから。だから、レイドに参加する全員はTeamspeakサーバーにサインインしなきゃいけなかった。これは基本的に音声だけのZoomコールで、私と任命したオフィサーたちが指示を出したり戦略を決めたりするためのものだった。コミュニケーションの重要な教訓をすぐに学んだよ:最悪を想定すること。驚くことに(当時の私には)、あなたが言っていることを理解できない人は、理解できないと教えてくれないんだ。だから、私は二つのルールを守るようになった。1. 一度言う価値があるなら、繰り返す価値もある。人々は半分しか聞いていない、気が散っている、注意を払っていないと仮定しよう。2. 人々があなたの知識を知っているとは仮定しない。実際、話している間は「リスナーが知らないかもしれないことは何か?」と自問自答しながら説明する。これらのルールを守れば守るほど、レイドはうまくいった。でも、WoWをやめた後も、この二つのルールは役立ったよ。特に二つ目は、知識の呪いを克服するのに役立つ。知識を持っている人が他の人もその知識を共有していると誤って仮定する現象だから。コミュニケーションの際に知識の呪いを考えることは、しばらくすると自然になってくる。そして、知識の呪いを気にしない他のコミュニケーターを観察すると、それが明らかになる。彼らは誰も理解できないような難しい用語や略語を使って自信満々に話し始めて、リスナーの理解なんて全く気にしないんだ。

40人のWoWレイドを運営できる人は、ほぼ確実にトップクラスのプロジェクトマネージャーになるってずっと言ってる。あのレイドは、猫を追いかけるようなもんだよ。気が散った、接続問題を抱えたティーンエイジャーの猫たちをね。

最近のプロジェクトのホームページやGitHubのREADME.mdって、「これを読んでるってことは、もう何のためのものか分かってるよね」って感じのノリが多いよね。もっと共感を持ってドキュメントにアプローチしてほしいな。何のためにあるのか、どんな問題を解決するのか、他の競合ソリューション(XやYなど)と比べてどうなのか、今でもベストな解決策なのか、それとも他のツールが主流になってメンテナンスモードなのかを教えてほしい。自分でメリット・デメリットのマトリックスを作れるようにしてほしいし、専門家だと思わないでほしい。自分に「人々がどんな質問を持つ可能性があるか、たとえ何を聞くべきか分からなくても」と考える時間を5分でも持って、それを書き留めてほしい。何ヶ月も何年もかけて何かを作っておきながら、他の人がそれを見つけやすくしないことで自ら台無しにする人の気持ちが全く理解できない。ドキュメントの種類についての視点を持つのもすごく大事だよね。https://diataxis.fr/ は、より良いドキュメントを作りたい人にとっての素晴らしい出発点だよ。

特にREADMEに関するこの問題は、ROS関連のロボティクスをやっている10年間、ずっとイライラさせられてきたよ。コードに入る前に、そのリポジトリが何をするのかの唯一の手がかりが名前の解釈だけっていうリポジトリが多すぎる。でも、これは普遍的なことだと思うし、君が言及しているように。オープンソースだけじゃなくて、仕事でもそう感じる。自分の会社でREADMEを編集してリポジトリの目的や関連するリポジトリを説明するPRを出すのは自分だけのような気がする。(昔はモノレポがいくつかあってもっと幸せだったけど、今は小さなプロジェクトごとに未文書のリポジトリができるのがトレンドになってしまった。)

この気持ちに共感するよ。開発者が自分の時間で、愛情を込めてやっていることは完全に理解しているけど、それが参入障壁を下げるのに本当に役立つと思う。ツールが便利なスタックの一部として使われることが多いとき、他のコンポーネントのドキュメントも解読が難しいことがあるから、理解するのが何倍も難しくなるんだよね。

このアプローチは本当におすすめだよ:専門知識が少ない人にドキュメントを見てもらって、ドキュメントの目的を達成することを目指すんだ。隣に座るか、画面共有してね。絶対に話しかけないし、助けないで、ただ見守るだけ。彼らがつまずくのを見て、何をすればいいか分からない様子を見て、あなた(著者)が既にxyzを設定しているから忘れていることを経験していないことを見守る。ユーザーが最小限のストレスや推測、曖昧さで必要なことを達成できれば、ドキュメントは合格。そうでなければ、彼らが失敗したすべての場所をメモして、一つ一つ対処して、新しいユーザーで繰り返す。FAANGのドキュメントでも、上記の基準を満たしていないものがあったよ。自分の組織がこの高い基準を設定してくれたことに本当に感謝してる。特に、たまにしか使わない重要な技術のドキュメントを使うときは(忘れていることが多いから)、会議やサポートの問い合わせ、ビデオ通話が減るから、ユーザーが自分で解決できるのがいいよね。

どんなドキュメントにもターゲットオーディエンスがあるよね。あなたのテストは、ターゲットオーディエンスが完全な初心者である場合にのみ非常に価値がある。もちろん、ターゲットを特定しても良いドキュメントを書くのは非常に難しいけど、全くそのテーマに無知な人にドキュメントをレビューしてもらうのは、量子物理学の博士論文をレビューするのと同じくらい無意味だよ。全く意味がない(信じて)。ドキュメントを書くのは難しい。まずは「誰のためにこれを書いているのか?」から始めよう。追記:OPの「専門知識が少ない」という部分を「完全な初心者」と誤解していたかもしれない。これは全く異なることだね。

これが私たちのドキュメント作成の流れでもあるよ。まず書いて、それからシステムにあまり詳しくない人に実行してもらう。みんなにドキュメントを改善するように促すのも大事だね。5年もシステムを使っていると、自分では気づかない盲点が出てくるから、経験の浅い人が指摘してくれることがある。そこで学んだ教訓は、ユーザーの自信を管理することが大切だってこと。だから、「このシェルコマンドを実行して」って指示する時は、デフォルトで折りたたまれたセクションをいくつかつけるようにしてる。成功した実行がどう見えるか、特に「無視できる警告」が含まれている場合はどうか、エラーが発生する可能性は?それは致命的なのか、すぐに修正できるのか?ちょっと複雑なシェルのことは、何がどうなっているかの説明もつけることが多い。そうなると、ランブックの一つのステップにドキュメントが1ページ分あることもあるけど、これが新しいチームメンバーのオンボーディングにすごく役立つことがわかった。今や、標準のランブックは私たちが使う普通のツールのクセやトラブルの良い紹介にもなってるんだ。

僕は中規模のソフトウェア会社でジュニアシステム管理者をやってる。ユーザー向けのワークフローをドキュメントにする時、ITに関係ない同僚2人にそれを通してもらって、彼らが気づいた小さなポイントをドキュメントに追加してもらってる。これで、他のユーザーがそのワークフローに参加する時の頭痛がかなり減ったよ。

以前、こういうのが得意な人と一緒に働いたことがある。彼はドキュメントを見ながら、指示通りにやって、問題が出たところを記録して、また最初からやり直すって感じだった。遅いように見えたけど、彼のドキュメントは素晴らしくて、彼が一回ずつやる方が、みんなが何度もやるよりも時間を節約できたと思う。

これは基本的に、スティーブ・クルッグの「考えさせないで」に書かれているユーザーテストのアプローチだね。アプリの使いやすさをテストするのにも使えるよ。

たくさんのドキュメントを書いてきたけど、数年にわたって見てきた大きな問題は、チームメンバー全体のスキルが落ちていくのを目の当たりにしたことだね。マネージャーからドキュメントを使うように言われて、それに従ったけど、必要なときにドキュメントの外で考えることができなくなってしまったみたい。Tier 1のサポート役にはドキュメントが役立ったと思うけど、ほとんどのチームにとってはドキュメントが足かせになって、役割を成長させてTier 2に上がることができなかったように見える。この問題をどう解決すればいいのか、ちょっと分からないな。

ジュニアにドキュメントを書き直させて、頭をひねりながらやらせて、理解できたらアップデートを出すのもアリだね。

自分が開発しているソリューションを実行するためのDockerイメージを常に提供するようにしてるよ。大体はそのDockerイメージが使われないことが多いけど、これは重要な練習なんだ。新しいシステムで自分のソリューションを実行することを強いられるから、結果的にドキュメントがより完全になるし、依存関係も簡単に確認できる形で記録されるんだ。

ただ見てて。これには自分に厳しくなる必要があって、人気を追い求めていることを理解しないといけない。ユーザーに人気があるのはいいけど、ユーザーが顧客じゃない場合もあるからね… > 自分はFAANGのドキュメントを使ったことがあるけど、上記の基準を満たすものには程遠いよ。… FAANGはその良い例だね。彼らのドキュメントやコードがひどいから、統合にかかる時間が誰も予想できないくらい長くなる。これが実際にはマネージャーが二回目の統合を考えるのをためらわせるんだ。つまり、「上記の基準を満たす」ことが必ずしも良いビジネスとは限らないし、そのことを忘れないことが大事だと思う。

特に、たまにしか使わない重要な技術のドキュメントを使うときは、忘れがちなんだよね。まだその知識が失われていないときに、書くときに見失いやすい重要なポイントだよ。

現在のブログ記事のタイトルは: > 私、非開発者が、あなた、開発者が私のために書いたチュートリアルを読む方法 だよ。HNのタイトルは: > 私、初心者開発者が、あなた、開発者が私のために書いたチュートリアルを読む方法 これらは異なることだよ。「非開発者」というのは、これを理解することが期待されていない人を指すと思う。人事の人や、内部に全く不慣れな顧客、全く異なる専門分野の人を想像している。彼らはsnarfusが何か、shamrockポータルをどうやってfisterfunkするかを知っている必要はない。そういう場合は、開発者が6段落の長いジョークで完全に的外れなことをしているのを笑い飛ばそう。初心者開発者は全く異なる存在だからね。この人は最終的にsnarfusを扱わなければならないし、残念ながらshamrockポータルをfisterfunkする必要もあるかもしれない。彼らがfisterfunkが何か、ポータルにどう適用されるかを理解するために努力するのは部分的に彼らの責任だよ。もし彼らが特に優れているなら、そういうことを理解した後、次の初心者開発者が理解しやすいようにドキュメントを更新することを自発的に申し出るかもしれない。

「私、初心者」と書いてあるね。HNの投稿者はおそらく長さのために編集したんだろう。

それは全てを変える。初心者の開発者が、他の開発者向けに作られた技術的な投稿が「What's Hoobijag/jabbernocks/ABCDE++++/Shoobababoo/シャムロックポータル」について説明してくれることを期待するのは無茶だよね。知らない言葉をググらなきゃいけないフェーズをみんな通ってきたから。

僕がティーンエイジャーの頃にプログラミングに興味を持つきっかけになったサイトは「FromZero」っていうもので、非開発者向けにC言語でプログラムを書く方法を説明してた。IDEのインストールからコンソールの開き方まで、各ステップを丁寧に説明していて、「Snarfusのことは心配しないで、後で説明するから」って言ってたのがすごく良かった。あのサイトのおかげで今のキャリアがあるんだ。とはいえ、ドキュメントを書くのは時間がかかるし、優先事項じゃないかもしれない。この場合、部分的なドキュメントが全くないよりはマシだと思う。でも、初心者の開発者を対象にするなら、彼らを非開発者として考えるべきだと思うよ、君が正しく説明したように。

これが、僕が本を書くのをやめてチュートリアルサイトを作り始めた主な理由だよ。Elementのようなインタラクティブなツールがたくさんあって、コンテンツを膨らませることなく、もっと多くの人にチュートリアルを届けられる。古い紙の技術の機能セットに制約されていることに、まだすごくイライラしてる。クリックしたり、ホバーしたり、エリアを折りたたんだり、動画を再生したり、ユーザーのアクションに反応したりできるのに、大半のコンテンツはただのダラダラしたテキストの壁になってる。ここでのOPも、フットノートを使ってページの下にスクロールさせて、読者にとって高コストなコンテキストスイッチを追加しているだけで、ブラウザの機能を活かすようなホバーやモーダルポップアップを利用していない。

こんにちは、今ちょうどブログをアップグレードしようとしてるんだけど、うまくやってるサイトを教えてもらえる?

ドキュメントを書くときは、読者に必要な知識やスキルの基準を設定することが大事だよ。どのレベルでも選べるけど、その基準からあまりにもかけ離れると、読者がイライラしちゃうことになる。そうなったら、言い訳するか、解決策に集中するかのどちらかだね。問題は難しいこともあるけど、AIシステムやGoogle、さらには本などの現代のツールを使えば、乗り越えるのは簡単になってるよ。もし「Shoobababoo」って何か、または「hoobastank」じゃなくて「quagmire」を使うべき理由が分からなかったら、調べればいいんだ。理想的には、ドキュメントには外部の知識移転がほとんど必要ないように、すべての答えが含まれているべきだけど、世界はそんな便利さを君に提供する義務はないからね。

読者に必要な知識やスキルの基準を設定することが大事だよ いろんなガイドが「制御システムシミュレーション」や「産業オートメーションのコンプライアンステストベンチ」みたいな設定をする時に、「exeをダブルクリックして次へ進む」から始まるのが多いよね。ガイドのユーザーに期待される知識の基準はめっちゃ重要だよ。

これについて前に書いたことがあるんだけど、ほとんどのドキュメントは本当にひどいよね。せいぜい明らかなことを繰り返してるだけで、最悪の場合は存在すらしない。大局を語らず、妙に具体的なエッジケースの詳細ばかりに偏ってることが多すぎる。もし、あなたのプロジェクトについて何も知らない状態から始めて、髪の毛を引き抜くことなく動かせないなら、そのドキュメントは失敗だよ。

それは違う。初心者向けに書いている人はいないよ。エンダーになりたい初心者はこれを知っているから、文句を言う前に何が必要かを理解するんだ。