9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

技術記事は、公開した瞬間から腐りはじめる

9
Posted at

ある日、自分の記事に裏切られた

数年前に自分が書いた記事を、後輩に紹介したことがある。「これ読めば環境構築できるよ」と。

数時間後、後輩から連絡が来た。「手順通りにやったんですが、エラーになります」。

見てみると、記事中で使っていたライブラリがメジャーバージョンアップしていて、APIが変わっていた。コード例はコピペしても動かない。記事の内容そのものは間違っていない。ただ、書いた時点では正しかっただけだ。

私は6年ほどフルスタックエンジニアとしてやってきて、個人ブログでTypeScriptやWordPressについての記事を書いてきた。そして気づいたことがある。技術記事というのは、生鮮食品に近い。公開した瞬間がいちばん新鮮で、そこからゆっくり腐っていく。しかも、見た目では腐っていることがわからない

「正しかった記事」が一番タチが悪い

嘘が書いてある記事なら、まだいい。読めばどこか怪しいと気づける。

タチが悪いのは、かつて完全に正しかった記事だ。丁寧に書かれていて、スクリーンショットもあって、はてブもたくさんついている。信頼するに足る見た目をしている。でもNext.jsのバージョンが2つ上がった今、そのコードは動かない。

読者は動かない原因が「自分の環境のせい」だと思い込み、数時間を溶かす。私自身、何度もやられた。そして申し訳ないことに、加害者側にもなっていた。冒頭の後輩の件がそれだ。

書き手を責めたいわけではない。記事を書いた後も永遠にメンテナンスし続けるのは、無償の個人活動としては現実的に無理がある。問題は個人の怠慢ではなく、**「記事の鮮度を保つ仕組みがどこにもない」**という構造のほうにある。

行政システムの現場で学んだ「動く証明」の重さ

私は自治体向けのシステム開発に関わってきた。この世界では「たぶん動きます」は通用しない。納品のたびに動作確認のエビデンスを揃え、検収を通す。動くことを、テストと記録で証明して初めて話が前に進む。

技術的リテラシーが異なるステークホルダーに説明するときも同じだった。「コードがきれいです」は伝わらないが、「この操作をすると、この結果になります。毎回、必ず」は伝わる。動くという事実は、最強のドキュメントなのだ。

ある日ふと思った。この考え方、技術記事に持ち込めないだろうか。

記事の文章がどれだけ丁寧かではなく、「この記事のコード例は、今日時点のCIでテストが通っています」と機械的に証明されていたら。読者は安心してコピペできるし、書き手は「腐ったら気づける」ようになる。

だから、記事にCIを付けた

その発想で、私は個人プロジェクトとして「記事のコード例が今も動くことをCIで証明する」仕組みを作りはじめた。

やっていることは単純だ。

  1. 記事のフロントマターに、対応するテストコードのパスとテストコマンドを書く
  2. GitHub Actionsが定期的にそのテストを実行する
  3. 結果を記事側に書き戻し、読者に「鮮度スコア」として表示する

記事側のフロントマターは、たとえばこんな具合だ。

tested_path: tests/articles/nextjs-app-router.test.ts
test_command: pnpm vitest run
verified_status: passing
last_verified: 2026-07-18

CIはこの tested_pathtest_command を読んでテストを実行し、結果を書き戻す。読者から見える記事には、この結果がバッジとして表示される。

テストが落ちれば、記事には「このコード例は現在動作しない可能性があります」と表示される。書き手には修正のシグナルが飛ぶ。記事が自分で「腐りました」と申告してくれるわけだ。

作ってみて実感したのは、これは技術の問題というより文化の問題だということだった。私たちはコードには当たり前にCIを付けるのに、コードについて書いた文章は書きっぱなしにしてきた。コードとドキュメントを別物として扱ってきたツケが、「動かない記事の山」として積み上がっている。

きれいごとだけでは、終わらなかった

とはいえ、作ってみて痛感した限界も正直に書いておきたい。

まず、テストを書くコストは重い。記事を書くだけでも大変なのに、そのコード例のテストまで書くのか、という話だ。すべての書き手にこれを求めるのは非現実的で、だからこそ「仕組み側で書き手の負担を最小化する」設計が要る。フロントマターに2行足すだけで済むようにしたのは、そのためだ。

次に、CIが通ることと記事が正しいことは、イコールではない。検証できるのはあくまでコードだけで、「この設定画面のスクショが古い」「説明文中のバージョン表記が古い」といった劣化は検出できない。鮮度スコアが緑でも、文章は腐っていることがある。これは今のところ、書き手の良心に頼るしかない。

そして、環境の再現性という深い沼がある。CI上のNodeのバージョン、OSの差異、依存パッケージのロックをどこまで固定するか。厳密にやるほど「読者の手元の環境」から乖離していく。「CIでは通るのに私の環境では動かない」が起きたら本末転倒だ。

それでも、と思う。完璧な検証は無理でも、何も検証しないよりは圧倒的にマシだ。テストカバレッジ100%が無理だからといって、テストを1行も書かない理由にはならないのと同じで。

記事は「書き捨て」から「育てる資産」へ

レガシーコード改善の名著『Working Effectively with Legacy Code』には、「テストのないコードはレガシーコードだ」という有名な定義がある。

これを借りるなら、こう言えると思う。

「検証の仕組みがない技術記事は、公開した瞬間からレガシー記事である」

もちろん、すべての記事にテストを付けるべきだとは思わない。考察やポエムに鮮度はないし、この記事自体もそうだ。でも「手順を示す記事」「コード例が主役の記事」については、書きっぱなしにしない選択肢があっていい。

小さくできることはある。記事に「動作確認した日付とバージョン」を明記する。コード例をGistやリポジトリに置いて、更新可能な状態にしておく。それだけでも、読者が溶かす時間はずいぶん減る。

私たちが記事を書くのは、未来の誰かの時間を節約するためだ。だとしたら、その記事が未来でも動くかどうかに、もう少しだけ責任を持ってもいい。

自分の記事に裏切られたあの日から、私はそう考えるようになった。


記事のコード例をCIで検証する仕組みは、plainmark としてオープンソースで開発中です。WordPressテーマ+プラグインのモノレポで、記事のフロントマターに書いたテストをGitHub Actionsが定期実行し、結果を「鮮度スコア」として読者に表示します。同じ問題意識を持っている方がいたら、ぜひコメントやIssueで教えてください。

9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?