「Stroustrupの法則」を知ればコードが変わる:C++の生みの親が説くシンプル設計の極意
Stroustrup's Rule (2024)
Stroustrup's Rule (2024)
「Stroustrupの法則」とは、C++の父であるBjarne Stroustrupが提唱した、シンプルさと複雑さに関する設計指針のことです。簡単に言えば、『複雑なコードは、単純なコードをいくつも重ねるよりも、それ自体が複雑であるほうがはるかに問題である』という教訓です。つまり、複雑さを隠蔽しようとして無理な抽象化を行うよりも、明快なコードを積み重ねる方がバグも少なく、保守性も高いという考え方です。現代のソフトウェア開発においても、過剰設計を避けるための強力なガイドラインとして、多くのエンジニアに再評価されています。
もう一つの重要な視点が抜けてるね。それは「直交性」だよ。単体で推論可能な機能を実装するための簡潔な記法なら、初心者にとってもエキスパートにとっても問題ない。だけど、環境と複雑に絡み合う機能は、構文がどうであれ推論が難しいんだ。(もちろん、構文がひどければ状況はさらに悪化するけどね)
もし見た瞬間に理解できるなら、簡潔な記法を導入しても全く問題ない。例えば、今適当に作った (!·!) という演算子。これを任意の式の周りに置くと、その値をSTDOUTにログ出力する。値そのものは元の式と同じになる(つまり (!3+7!) は 10 と等しい)。
(Hillelがリンクした)今はないWebページの、10年前にここに投稿された時の議論がこれだよ:
https://news.ycombinator.com/item?id=13192052 (https://news.ycombinator.com/item?id=13192052) - 2016年12月16日、コメント73件
ストラウストラップのルールをこう修正したいな:
新機能に対しては、みんな「明示的で目立つ構文」を要求する。
定着した機能(結果として頻繁に使われるようになったもの)に対しては、みんな「簡潔な記法」を求める。
つまり、機能に慣れたから簡潔にできるというよりは、十分に時間が経って「どの機能が頻繁に使われていて簡潔な構文に値するのか」が明らかになるからだと思う(彼が挙げたRustの例みたいにね)。
これは選択バイアスの一種だよ。あまり使われなくて冗長なまま放置されている定着機能は他にもたくさんあるけど、めったに使われないからみんな気づかないだけさ。
でもそれはルールというより、「ストラウストラップの観測」だね:
新機能に対しては、みんな「明示的で目立つ構文」を要求する。
定着した機能に対しては、みんな「簡潔な記法」を求める。
自然言語でも似たようなことがあるよね:
「最小努力の原理」がもう一つの説明として考えられる:ジップ自身が提唱したように、話し手も聞き手も、理解に至るために必要以上の努力をしたくない。そして、その努力を均等に分配しようとするプロセスが、観測されるジップ分布につながるのだ。[5][31]」 -- 出典: https://en.wikipedia.org/wiki/Zipf%27s_law (https://en.wikipedia.org/wiki/Zipf%27s_law)
最初は「明示的な構文」の方が認知負荷が低い。でもすぐにその労力は消え、今度は「簡潔な記法」の方がタイピングの労力が少なくて済むようになる。
一つ付け加えると:
最初から簡潔な構文を教えると生徒は即座に怒るけど、冗長な構文を教えると後になってから怒られることになるよ。
同じ文脈で、前のやり方がひどすぎたから作られた機能ってのもあるよね。例えば、コールバック地獄を経験したことのない人にJSのasync/awaitを説明するのは難しいし、C++を触ったことのない人にRustのボローチェッカーの必要性を説くのも同じくらい難しい。