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

ロブ・パイクのプログラミングに関する5つのルール

2026年3月18日原文(cs.unc.edu)

概要

  • プログラムのボトルネックは予想外の場所に現れる点
  • 最適化は計測後に行うべきという原則
  • 複雑なアルゴリズムは小規模データには向かないこと
  • シンプルなアルゴリズムとデータ構造の重要性
  • データ構造選択がプログラミングの中心である点

プログラム最適化に関するPikeのルール

  • ルール1 :プログラムのどこで時間がかかるかは予測困難 ボトルネック は意外な場所に現れがち 速度向上の工夫 は、実際に問題箇所を特定してから実施

  • ルール2 :必ず 計測 してから最適化 速度向上 のための調整は、計測データに基づき実施 一部のコード が全体を圧倒する場合のみ最適化を検討

  • ルール3複雑なアルゴリズム は小さいnでは遅い nが小さい 場合はシンプルな方法が有効 大きなn の場合でも、まず計測(ルール2)を優先

  • ルール4複雑なアルゴリズム はバグが多く実装も難解 シンプルなアルゴリズムシンプルなデータ構造 を推奨

  • ルール5データ構造 が最重要 適切な データ構造選択 と整理でアルゴリズムも自明となる プログラミングの中心 はアルゴリズムでなくデータ構造

関連する有名な格言・設計哲学

  • ルール1・2 はTony Hoareの「 Premature optimization is the root of all evil (早すぎる最適化は諸悪の根源)」の再表現
  • ルール3・4 はKen Thompsonによる「 When in doubt, use brute force.(迷ったら力技でやれ)」に該当
    • KISS原則( Keep It Simple, Stupid)の具体例
  • ルール5 はFred Brooksの「The Mythical Man-Month」で言及
    • write stupid code that uses smart objects (賢いオブジェクトを使った単純なコードを書け)」と要約されることも多い

まとめ

  • 最適化 は計測と根拠に基づく判断が重要
  • シンプルさデータ構造重視 の設計思想
  • 歴史的な名言や原則に裏打ちされたプログラミングのベストプラクティス

Hackerたちの意見

アラン・J・パーリスの「プログラミングのエピグラム」には、短い知恵の断片がたくさんあるよ :) https://www.cs.yale.edu/homes/perlis-alan/quotes.html

ルール5. データが支配する。正しいデータ構造を選んで、うまく整理できていれば、アルゴリズムはほとんど自明だよ。プログラミングの中心はアルゴリズムじゃなくてデータ構造なんだ。パーリスのバージョンが好きだったな。ちょっとファンクショナルプログラミングで使いすぎかもしれないけど、ニュアンスを考えれば実際にはうまくいくことが多いよね。 9. 10個のデータ構造に10個の関数を使うより、1つのデータ構造に100個の関数を使う方がいい。

実際の引用はこうだと思うよ: 「フローチャートを見せて、テーブルを隠せば、私はずっと混乱するだろう。テーブルを見せてくれれば、フローチャートは必要ない。明らかだから。」 -- フレッド・ブルックス、『神話のマン・マンス』(1975年)

さらにこういうのもあるよ:

実際、悪いプログラマーと良いプログラマーの違いは、コードとデータ構造のどちらを重要視するかだと主張するよ。悪いプログラマーはコードを気にする。良いプログラマーはデータ構造とその関係を気にする。 -- リーナス・トーバルズ

HaskellやReScript/OCamlみたいな言語はCRUDアプリケーションにすごく合ってると思う。データと型についてまず考えさせられるから。その後、関数を通じてデータに対してどんな変換をしたいかを考える。新しいコードを見るときは、まず型を確認することが多い。具体的には、何が保存されていて、何が読み込まれているかをね。

ペルリスがたまに言及されるのを見るのは嬉しいね。SICPを再読してるけど、まだ新しいことを学んでるよ。

アラン・ケイとリッチ・ヒッキーのスレッドを思い出した。アラン・ケイは「データ」は悪いアイデアだと思ってる。彼の視点の解釈としては、必要なのはデータを「説明する」プロセスやインタープリター、ライブオブジェクトだってことだ。https://news.ycombinator.com/item?id=11945722 編集: 彼はQuoraでもっと詳しく書いてるよ。要するに、プログラミングの中心は「データ」じゃなくて「意味」だと言ってる。https://qr.ae/pCVB9m

100個の機能と1つのデータ構造があれば、グローバル変数でプログラミングしてるのとほぼ同じだよね。新しいインスタンスが新しいプロセスに相当する感じ。これ、あんまり良いルールじゃない気がする。

大学卒業したての頃に読んだ「Dive into Python」のこの引用は、プログラミングの本で読んだ中で一番影響を受けた言葉の一つだな。

「忙しい作業のコードは重要じゃない。データが重要だ。そしてデータは難しくない。ただのデータだ。もしデータが多すぎるなら、フィルターをかければいい。欲しいものでなければ、マッピングすればいい。データに集中して、忙しい作業は置いておけ。」

基本的に逆のことを言ってるんじゃない?パーリスは「正しいデータ構造を選ばず、人気のあるものにデータを押し込めろ」って言ってる。これは汎用プログラミングが広まる前は意味があったかもしれないけど、今は時代遅れだと思う。

ルール5. データが支配する。正しいデータ構造を選んで、物事をうまく整理できていれば、アルゴリズムはほぼ自明だ。プログラミングの中心はアルゴリズムではなくデータ構造だ。30〜40年コードを書いてきて学んだことはこれだ。

でも、2番目のルールはパイクの5番目のルールと直接対立してるんじゃない?これらはすべて、塩をひとつまみ加えて考えるべき格言のように思える。

2. 関数はバインディングを遅らせる; データ構造はバインディングを引き起こす。道徳: プログラミングプロセスの後半でデータを構造化すること。

1と2は新しさがある場合にしか当てはまらない気がする。というのも、同じようなシステムを同じドメインでたくさん作ると、どこを最適化すべきかなんとなくわかるから。ほとんどの人は同じようなシステムを作る傾向があって、特定のドメインでキャリアの大部分を過ごすことが多いよね。経験と直感だけでパフォーマンスのボトルネックがどこになるかを事前に見抜けないなら、スタッフやプリンシパルとは言えない気がする。

Hacker Newsで議論の続きを見る