すがブロ

sugamasaoのhatenablogだよ

DRY原則とDRYさせない方法

SmartHR Advent Calendar 2024 シリーズ1 の3日目です。

前日はalpaca-tcさんのRailsで任意のキャッシュストアを移行する - alpaca-tcでした。

さて、12月ですね。皆さん乾燥していますか?私は冬場の寒さに耐えられずエアコンを使いまくってしまうので当然のように乾燥しまくっています。

少し前まで空気清浄機兼加湿器を使っていたのですが、タンクの形状が複雑で汚れがちだったり加湿が十分なのかわからん、という状態でした。

そんなわけで2023年に象印のいわゆる魔法瓶的な加湿器を買って利用するようになったのですが、かなり潤ってる感じがしていて、なんなら加湿器に近い部分の布団は若干湿ってるような勢いなので乾燥対策はできていると考えて良さそう。

ちなみに、買った機種はこれです。 www.zojirushi.co.jp

給水のためには本体ごと持って行かないといけないので少々重かったり、デカいので風呂場でシャワーヘッドを使って給水することになっていますが、部品を外す手間などもないので楽と言えば楽です。シンプルな分取り扱いしやすいしオススメです。

これがDRYさせない方法ってコト!? ーーそうだよ!

というわけで閑話休題

DRY原則

良くも悪くもDRY原則、よく聞きますよね。「DRYにする」といって同じ仕様ではなく同じコードをまとめちゃってPRでやり取りをする、なんていうのは一生に一度は経験しているものかもしれません。

でも待ってください。そもそも、ぼくらはDRY原則について何を知っているのでしょうか?よく言及される原則ではありますし、大筋はわかると思うのですが原典ではどのように書かれていたのでしょう?

我々は原典を探すため、Amazonの奥地へと向かった

DRY原則の原典

Wikipediaによると、達人プログラマーが出典と書いてあります。

www.ohmsha.co.jp

おお、俺たちの達人プログラマーが原典だったのか。大昔に読んだ気がするけど全く覚えていない。

改めて読んでみても良いかもしれない……と考えたところで思い当たったのですが、達人プログラマーは初版と第二版が出版されています。

初版と、およそ20年の歳月を経て出版された第二版で内容を見比べてみると、当時と現代で気をつけているポイントが異なるかもしれないし、この二つを見比べてみると面白いかもしれない。

というわけで見比べてみました、というのが本エントリーの趣旨です*1

DRY原則に関する初版と第二版の違い

まず、目次のタイトルからして違います。なんと初版ではDRY原則という名前がついてない(本文中に出てくる)。

初版 第二版
1章 7 二重化の過ち 1章 9 DRY原則 - 二重化の過ち

この時点で、20年の時を経てDRY原則が概念として確立した気配を感じますね。

ではもう少し見てみましょう。

流石に本文を丸々載せるわけにはいかないので、ざっと見出しを抜き出してみます。

初版

  • どのように二重化が発生するのか?
  • やむを得ない二重化
  • 不慮の二重化
  • 手抜きによる二重化
  • 開発者間の二重化

第二版

  • DRY原則はコード以外にも適用される
  • コードの二重化
  • コードの二重化すべてが知識の二重化というわけではない
  • ドキュメントに二重化
  • データにおけるDRY原則の違反
  • 表面上の二重化
  • 内部APIの間での二重化
  • 外部APIの間での二重化
  • データソースの二重化
  • 開発者間の二重化

比べてみて

シンプルな話ですが、第二版になって分量が増えています。それはなぜかというと、第二版にこのような記述があるのです。

「まず最初に述べておきたいことがあります。本書の初版では、「 DRY原則」が意味することについて書き足りない部分がありました。多くの人々はこれがコードの話だと受け取ってしまったのです。つまり、 DRYを「ソースコードのコピー&ペーストをしてはいけない」と解釈してしまったのです。これも DRY原則の一部ですが、ほんの些細な一部でしかありません。 DRY原則は「知識」や「意図」の二重化についての原則です。つまり、異なった場所(おそらくはまったく異なった場所)に同じことを表現するという問題を避けるための原則です。」

—『達人プログラマー ―熟達に向けたあなたの旅― 第2版』David Thomas, Andrew Hunt著 https://a.co/bGDC7rE

こうして見ると、当時の後悔だったのかそれ以降の時勢を読み取ったのかは分かりませんが、第二版で丁寧な解説になっているように見えます。 ソースコードの例も増えていて、わりとイメージつきやすくなっている印象もあります。

ただ、「データソースの二重化」に関しては趣旨はわかるけれども、あまり自分の好みじゃないかもしれねえ……。

それはさておき、第二版では「DRY原則」が指していることが詳細化され、言いたいことが誤解なく伝わるような構成になっていることと合わせて、内部APIや外部APIなどに言及されている点は現代っぽいなと感じました(とはいえ、API関連の話はそこまで記述が厚くなくて無念)。他にも、コミュニケーション面での話ではデイリースクラムやslackが例として挙げられるなど、本当にモダナイズされています。

詳しくは本書を買って君の目で確かめてくれ!という話なんですが、改めて読んでみた感想としては初版・第二版それぞれ良さがあるものの、DRY原則については「プログラマが知るべき97のこと」のDRY原則のエッセイを見るでも十分かもしれませんね……。

xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com

それはそれとして、改めて達人プログラマーに目を通してみて再確認したのですが、ぼくは達人プログラマーの「まえがき」と「第一章」が好きすぎるかもしれない。自分のプログラマーとしての考え方の原型はここにあるなと再確認しました*2。 特に「まえがき」で書かれている "「単なる石を切り出すのが我々の仕事であったとしても、常に心に聖堂を思い描かなければならない」" が本当に好きすぎるんですよね

あなたの石切工はどこから?と聞かれたら「達人プログラマー!」と答えるくらい好きなので……

最終的にDRY原則というよりは達人プログラマー好きすぎるという話なんですが、読んでない人はみんな読んで!!!!1

www.ohmsha.co.jp

*1:偶然にも、初版と第二版を所持していた

*2:正確には、この本と「My Job Went To India」で作られたと言っても過言ではない