性善説的なコーディング規約と性悪説的なコーディング規約

 コーディング規約には、2つの方向性があると思います。

 1つはインディアンヒルのC Style and Coding Standardsのような、開発者を啓蒙するための指針です。こちらの規約は、主に開発者の主体的な能力向上を目的とします。
 方向性としては、開発者の裁量の余地を残すように規約を設定し、開発者各人の経験やこだわりを無理に抑圧しないようにします。規約の内容も、書き方の指定よりも、間違った記述のリスクの説明が中心となります。開発者の経験や能力に期待する、いわば性善説的なルールです。

 もう1つはMISRA-Cのような、コードの品質を保証させるための開発規則です。こちらは、開発者の能力になるべく依存せずにコードの統一性や最低品質を保障することを目的とするものです。
 方向性としては、記述方法を具体的に指示することで、どのような開発者であっても統一性が保たれたコードを記述できるようにします。規約の内容は、例外が生じないように具体的に、厳密に定義したコードの書き方が中心となります。能力の低い開発者がいても一定の品質を保障できるようにする、いわば性悪説的なルールです。


 コーディング規約を策定する側としては、それぞれの方向性に応じて、それぞれ異なる注意をすべきと感じます。

 まず性善説的な規約の策定にあたっては、開発者に対する説得力が重要です。具体的には、規約に十分な理由付けを行う、権威を持つ書籍や論文からの引用を適度に交える、策定に多くの熟練者や実力者を巻き込む、といった努力が必要でしょう。これはこちらが要求する規約に対して、開発者が納得し、実践するように促す必要があるためです。また事前のコミットメントなども必要でしょう。

 一方、性悪説的な規約の策定にあたっては、適合判断のしやすさを重視しなければならないと思います。具体的には、静的解析ツールでチェック可能なルールを作る、レビュー時に簡単に適合・非適合判定ができるように基準を作る、といった工夫が必要だと考えます。
 これは外部チェックを容易にすることで、開発者の能力不足に起因する粗悪なコード(規約策定者としては規約を守っていないコード)の洗い出しをやりやすくするためです。
 なお性悪説的なコーディング規約は、最低限の品質を底上げする代わりに、しばしば開発効率を落とします。そのため外部チェックの難易度があがり最低限の品質が保証出来ているか判定できなくなると、最悪効果があまりないのに開発効率を低下させることになりかねません。それだけに、適合判断の容易性は重要です。


 もちろん、性善説の規約、性悪説の規約の2択しかない、というわけではありません。MISRA-Cにも開発者の裁量を広げるような手段(プロセス)が用意されていますし、インディアンヒルの規約でも、具体的にコードの書き方を強制するルールがあります。それぞれのメリットを活かすのがやはり理想です。
 ただこうした視点を持っておくと、効果的な規約作成の一助になるのではと思います。