仕事に効くコンピュータサイエンス
同じ仕事を二度しない — DRYと共通化読了目安 10分

同じ知識を二度書かない — DRY原則

前のページで見た数字のズレも、ひな形の乱立も、原因は一つでした。同じ知識が、複数の場所にバラバラに存在していたことです。では、この状態を防ぐには、どんな考え方を持てばよいのでしょうか。このページでは、その答えとなる原則を一つに絞って見ていきます。

繰り返すな、という原則

プログラミングの世界には、DRYと呼ばれる設計原則があります。「Don't Repeat Yourself(繰り返すな)」の頭文字を取ったものです。

考え方はシンプルです。ある一つの知識やルールには、システムの中でただ一つの「正しい置き場所」があるべきだ、というものです。同じ計算式や同じ数値を、コードの複数箇所にコピーして書かない。書きたくなったら、まず「すでにどこかにないか」を確認する。

これを徹底すると、変更に強くなります。消費税率が変わったとき、税率を書いた場所が1つなら、直すのも1箇所です。税率を10箇所にコピーして書いていたら、10箇所すべてを探して直す必要があります。1箇所直し忘れれば、そこだけ古い税率のまま計算され続けます。

DRYが問題にしているのは「同じ文字列が2回出てくること」自体ではありません。「同じ知識・同じ判断基準が、独立して2箇所に存在すること」です。見た目が違っていても、意味している中身が同じなら、それは重複です。

逆に言えば、見た目が同じでも意味が違えば、それは重複ではありません。この区別を持っておくことが、DRYを正しく使う出発点になります。区別を誤ると、次に見る落とし穴にそのままつながります。

なぜプログラムの世界で、この原則がここまで強調されるのでしょうか。理由は単純です。コードを書く人は、既存の処理をコピーして少し変える作業を、つい楽な近道として選びがちだからです。コピーした瞬間は速く進みますが、そのコピーが後で必ず「直し忘れ」の火種になります。DRYは、その場の速さより、後々の変更しやすさを優先する考え方です。

これは仕事でも全く同じ構図です。既存の資料をコピーして少し書き換える方が、ゼロから作るよりずっと速く感じます。その速さと引き換えに、元の資料が更新されたとき、コピーには反映されないという負債を背負います。目の前の10分を節約するために、半年後の30分を余計に払う取引をしていることになります。

仕事の言葉に翻訳する

仕事に置き換えると、DRYはこう言い換えられます。「あるルールや数字について、これを見れば必ず正しい、という場所を一つ決める」。各自が自分の理解でコピーを作ったり、記憶で運用したりしないということです。

前のページの例で言えば、返品の扱いというルールには、本来ただ一つの正しい定義があるべきでした。Aさん、Bさん、Cさんがそれぞれ自分の解釈で運用していたのは、定義がどこにも一箇所にまとまっていなかったからです。

これは「みんなで話し合って統一しよう」という気持ちの話ではありません。統一した後、それをどこか一箇所に書いて、全員がそこを見に行く仕組みにする、という置き場所の設計の話です。話し合いだけで終わると、半年後にはまた解釈がズレていきます。

置き場所は、紙の規定集でもチャットの固定メッセージでも構いません。大切なのは「迷ったらここを見る」という場所が、組織の中でただ一つに定まっていることです。場所が2つあると、それだけでまた重複が始まります。「このExcelとあのPDF、どちらが最新ですか」という質問が生まれた時点で、置き場所の一本化は既に崩れています。

もう一つ大事なのは、「参照する」という行為の作り方です。知識を一箇所にまとめても、みんなが結局それをコピーして自分の手元に貼り付けてしまえば、コピーが増えるという同じ問題が形を変えて再発します。理想は、コピーではなくリンクで済ませることです。資料の中に数字を直接書き込むのではなく、「単価表はこちら」という参照先を示すだけにしておく。そうすれば、参照元が更新された瞬間、見る人全員に最新の状態が届きます。

紙の資料しかなかった時代は、これが難しい選択でした。今は共有フォルダや社内Wikiのように、リンク一つで最新版に飛べる仕組みが手軽に使えます。「コピーして自分用に持つ」から「見に行く」への切り替えは、道具の問題ではなく、習慣の問題であることがほとんどです。一度リンクで済ませる癖がつけば、更新の反映漏れという心配自体が要らなくなります。

具体的な場面で見る

価格表を一つにする。見積書を作るたびに、担当者が単価をその都度手入力しているとします。値上げのたびに、過去に配布した見積テンプレートの数字を、一つひとつ探して直さなければなりません。単価表というマスタを一箇所に作り、見積書はそこを参照する形にすれば、値上げの反映は一箇所の更新で済みます。担当者ごとに単価を覚えている状態から、「単価表を見れば誰でも同じ数字にたどり着ける」状態に変わります。これは単なる手間の削減ではなく、古い単価のまま見積もってしまうという失注リスクを減らすことでもあります。

判断基準を一つにする。問い合わせをどのレベルの担当者にエスカレーションするか、という判断基準が、担当者ごとの経験則に頼っているとします。ベテランは勘で正しく振り分けられても、新人は同じ問い合わせを誤って自己判断で処理してしまうかもしれません。エスカレーションの基準を一つの判断フローとして書き出しておけば、経験の差に関わらず同じ基準で振り分けられるようになります。ここで重複しているのは書類の書式ではなく、判断のロジックです。DRYは値や文書だけでなく、「こういうときはこう判断する」という基準そのものにも当てはまります。

休日カレンダーを一つにする。各チームが年始に、祝日をそれぞれ手作業でカレンダーに転記しているとします。祝日の移動があった年、転記漏れが起きたチームだけ休日の認識がズレます。全社共通の休日カレンダーを一つ用意し、各チームのスケジュールはそこを参照する形にすれば、更新は一箇所で済み、ズレる余地がなくなります。

承認基準を一つにする。稟議の承認ラインについて、部署ごとに独自の解釈で運用されているとします。ある部署は10万円以上を課長決裁、別の部署は5万円以上を課長決裁としていて、異動してきた人がそのたびに戸惑います。承認基準を定めた規定文書を一つ用意し、部署ごとの独自ルールを廃止すれば、異動のたびに一から覚え直す必要がなくなります。

用語の定義を一つにする。「今月」という言葉一つを取っても、経理は締め日基準、営業は暦月基準で使っていることがあります。同じ言葉が部署ごとに違う意味で使われていると、数字を突き合わせるたびに翻訳作業が発生します。用語集を一つ作り、社内で使う言葉の定義をそこに集約しておけば、この翻訳作業そのものが要らなくなります。「アクティブ顧客」「稼働率」といった、一見わかりやすそうで実は部署ごとに定義が揺れやすい言葉ほど、用語集に入れる価値があります。定義を一箇所に決めておくだけで、会議で毎回発生していた「それってどういう意味ですか」という質問が減ります。

4つの場面に共通するのは、「統一した後に、参照先を一箇所に決める」という手順です。統一だけして、書き出す場所を決めなければ、また元に戻ってしまいます。

落とし穴 — 似ているだけのものまで一本化する

DRYには、機械的に当てはめすぎると起きる罠があります。「見た目が似ている」というだけの理由で、本当は別の知識であるものまで、無理に一本化してしまうことです。

たとえばの話です。営業部の見積フォーマットと、総務部の稟議フォーマットが、たまたまレイアウトが似ていたとします。「同じテンプレートにまとめれば管理が楽になる」と考えて統合すると、どうなるでしょうか。

営業部の都合でフォーマットを変更すると、総務部の稟議書のレイアウトまで意図せず崩れてしまいます。2つは見た目が似ていただけで、中身の意味(見積の根拠なのか、社内承認の記録なのか)は別物だったからです。

DRYが対象にすべきなのは、「同じ知識」であって「似た見た目」ではありません。この見極めを誤ると、重複をなくしたつもりが、かえって無関係な業務同士を結びつけてしまいます。

見分け方の目安が一つあります。「片方だけを変えたい状況が、将来ありえるか」を考えることです。営業部が見積フォーマットだけを変えたい場面は、十分にありえます。その時点で、稟議フォーマットとは別物として扱うべきだと分かります。逆に、返品ルールについて「経理だけ違う定義を使いたい」場面は考えにくいはずです。それなら一本化して問題ありません。

この問いは、一度答えを出して終わりではありません。事業の状況が変われば、「別々に変えたい理由」が後から生まれることもあります。一本化したものが将来もずっと一本のままとは限らない、という含みを持っておくと、後で分割する判断もしやすくなります。最初から完璧な線引きを求める必要はありません。迷ったときは、いったん別物として扱っておく方が、無理に一本化して後戻りできなくなるより、安全な選択です。

この「早すぎる一本化」の危うさについては、5ページ目で改めて掘り下げます。DRYは強力な原則ですが、対象を見誤ると、重複を減らすどころか、かえって業務同士を不必要に縛ってしまいます。

もう一つの落とし穴もあります。DRYを理由に、「一箇所にまとめる」ことばかりに気を取られ、まとめた先の中身が誰にも分かりにくい形になってしまうことです。単価表を一箇所にまとめたのに、表の構造が複雑すぎて誰も更新できない、という状態では本末転倒です。一箇所にまとめることと、それを分かりやすく保つことは、別の作業として両方必要になります。

次のページでは、この「まとめた知識」を実際にどう手順として運用するか、つまり関数化という考え方を見ていきます。

持ち帰り

  • DRY原則とは「同じ知識にはただ一つの正しい置き場所を作る」という考え方
  • 統一するだけでなく、参照先を一箇所に決めて初めて重複はなくなる
  • 見た目が似ているだけのものまで無理に一本化すると、別の問題を生む

やってみる

自分がよく使う数字やルール(単価・締切・承認基準など)を1つ選び、「これの正しい置き場所はどこか」を今日、同僚に確認してみてください。答えが人によって違ったら、それこそが最初に手をつけるべき重複です。