コーディングスタイルで大事なこと

 コーディング規約などを作る際、しばしば論争対象になるものにスペーシング、インデント、括弧の位置といったコーディングスタイルがあります。例えばC言語なら「K&Rスタイルがよい」「いやK&Rは改行が窮屈だから、Allmanスタイルが良い」といった議論が該当するでしょう。

 この手の議論は、個人の好き嫌いや経験が絡んでくるために厄介な問題になりがちな感があります。またスタイルでごねるのが「スタイルにこだわりがある職人」とアピールする一種のパフォーマンスになっている現状もあり、非生産的な宗教戦争に陥ることもしばしばあります。

 今回は、こうした非生産的な状態に陥りがちな、コーディングスタイルの規約化について書いていきたいと思います。

コーディングスタイルで重要なこと

 コーディングスタイルに関しては、とりあえず汎用的な目標として、以下のような守った方が良いルールが存在します。

開発環境に適合している

 以下のように、開発環境がスタイルに制約を課してくる場合があります。

  1. IDEが特定のスタイルに則ったインデントやスタイルの調整支援機能を持っている
  2. 使用フォントが可読性に問題を持っており(例えば文字間のスペースが足りないため「(i」と「(j」の区別がつきにくい等)、スペーシングで可読性を補強しなければならない
  3. タブを使用すると、自動生成ドキュメントのレイアウトが崩れる

 こうした要求は、好き嫌いを超えた実利問題に関わるものです。効率性を損なわないためにもなるべく規約スタイルに反映させた方が良いでしょう。

統一されている

 コーディングスタイルの統一運用は以下の理由から有効です。

  • マージやdiffといったテキスト処理を効率的に行えるようにするため。例えばスタイルが統一されておらず各人でばらばらにスタイル調整が行われる状況では、スペース・インデント・改行といった(機能・バグとは関連性のない)変更のために、diff結果の可読性が悪化したり、マージ時の競合解消作業が頻発したりするリスクが高まります。特に「気に入らないスタイルだったからスタイルを全て改めた」などといったことをされると、バージョン管理でのログの断絶と同等と悪影響が発生する場合もありえます。スタイルを統一しておけば、そうした煩わしい障害を事前に回避できます。
  • 無秩序を回避するため。スタイルは一目見て確認できるものであるため、スタイルの乱れたコードは読む人に「管理されていない」「コードの綺麗さは重要でない」といった印象を与える可能性があります。そうした印象は、より品質の悪い場当たり的なコードの混入を後押ししてしまうリスクを持っています。逆にスタイルを統一していれば、秩序ある状態へ自ずと収束させる心がけをメンバ間で形成できるようになります。
  • 粗悪なコードを強調明示するため。スタイルの統一不統一は容易に確認できるため、コード品質の手軽な指標として用いることができます。例えばスタイルがデフォルトで統一されていれば、「新人でスタイルといったルールを知らない」「スタイルに気を回すほどの余裕がない」といった問題を抱えるエンジニアを、スタイルの乱れによってある程度早期に検出できるようになります。


 以上、まとめれば、環境に合ったスタイルを統一して運用することが肝、ということです。後は、それに矛盾しない範囲から、常識的なスタイルを選ぶ形で規約を具体化していけば良いでしょう。
 一方で、この方針に反する方向に議論をこじらせたり、この方針を超えた理由で議論を長引かせたりするのは、あまり生産的でないといえます。その当事者は、道具にこだわる職人ではなく偏屈で時間を無駄に浪費させる迷惑人である、と見なされても仕方がないでしょう。

コーディングスタイル規約の運用について

 なお開発プロジェクトや使用する処理系が変わると、IDEのスタイル自動調整機能等も変わって、「環境に合っているスタイル」が変化する場合があります。そうした環境では「環境に合っているスタイル」が複数出てくることになり、統一したスタイル規約の作成が困難になることもあるでしょう。

 こうした問題に対しては、IPA/SECが公開しているESCR(組込みソフトウェア開発向けコーディング作法ガイド)のアプローチが参考になると思います。具体的にいうと、特定のスタイルを指示する規約を作るのではなく、開発単位ごとにスタイルを規定するドキュメントを作らせる規約を作る、というものです。
 そこではメインの規約は「スタイルを定める対象は何か」を示すだけであり、具体的なスタイル規約は各プロジェクトや開発単位での担当者が各々の環境に合わせて作成することになります。このアプローチは、複数種類のスタイル規約をどう運用するか、といった新たな課題を生みますが、環境に合わない規約を強制しようとして議論がこじれてしまう事態に対する回避策としては有効です。