見ろ、この美しいインデントを。これが3スペースだ。

## インデント論争

時として論争を巻き起こすインデント問題。時としてIT業界カップルを破局にまで追い込む？それがインデント論争。あなたはスペース2桁派？4桁派？それともタブ派？

__私は3スペースです。__

マイナーで奇抜な選択肢に思えるかもしれませんが、3スペースには独自の美しさがあります。愛らしさがあります。このスタイルに出会って以来、コードを書く楽しさが倍増しました。

ほとんんどの人は、スペース4桁かタブ派だと思っています。そして「明日からスペース2桁でコードを書いてね」と会社で言われたとしても、ほとんどの人は不満を感じつつも「わかりました、、、」と返事をすると思っています。でも、ほとんどの人は「明日からスペース3桁でコードを書いてね」と言われたら、「えっ、何でですか？」って質問をするんじゃないかなと思います。それが3スペースです。

私も新入社員研修で、3スペースを講師に押し付けられた時は発狂しそうになった記憶です。こんなヒョウ柄のお洋服は着たくない！そんな気持ちだったと思います。最初は毛嫌いされる。それが3スペースです。そして使い始めると、ヒョウ柄のお洋服も意外といいんじゃない？いや、逆に最高と思えてくる。それが3スペースです。

この記事では、3スペースをこよなく愛する私がその魅力を紹介します。

## インデントスタイルの比較

try/catch+3重ループで比較してみると、意外と3スペースいいんじゃないっ？って思いませんか？

```java:4スペース(タブ4桁分)
//まぁ、普通ですよね。これに慣れていれば可もなく不可もなく。
public class IndentationExample {
    public static void main(String[] args) {
        try{
            for (int i = 0; i < 10; i++) {
                for (int j = 0; j < 10; j++) {
                    for (int k = 0; k < 10; k++) {
                        System.out.println("hello world");
                    }
                }
            }
        }catch(Exception e){}
    }
}
```

```java:2スペース
//HTMLであれば2スペースは許容できますが、通常のコーディングではインデントが控えめすぎ。
//ネスト構造が見えにくい。
public class IndentationExample {
  public static void main(String[] args) {
    try{
      for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 10; j++) {
          for (int k = 0; k < 10; k++) {
            System.out.println("hello world");
          }
        }
      }
    }catch(Exception e){}
  }
}
```

```java:8スペース(タブ8桁分)
//横方向のスペース消費が大きすぎて、短い行でもスクロールが必要になる場合がある。
//見た目は明確だが、視線移動に意識がもってかれてロジックが頭に入ってこなそう。
public class IndentationExample {
        public static void main(String[] args) {
                try{
                        for (int i = 0; i < 10; i++) {
                                for (int j = 0; j < 10; j++) {
                                        for (int k = 0; k < 10; k++) {
                                                System.out.println("hello world");
                                        }
                                }
                        }
                }catch(Exception e){}
        }
}
```
```java:3スペース
//なんということでしょう。ネスト構造が一目で分かる絶妙なバランス。
//過剰なスペース感もなく、全体の収まりが美しい。これぞ黄金比。これぞ美しいインデント。
public class IndentationExample {
   public static void main(String[] args) {
      try{
         for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
               for (int k = 0; k < 10; k++) {
                  System.out.println("hello world");
               }
            }
         }
      }catch(Exception e){}
   }
}
```

## なぜ3スペースなのか？

- __バランスの美学__：
2スペースでは主張が足りず、4スペースはインデント幅が過剰な気もする。中間に位置する3スペースは、ちょうどよい塩梅です。
- __視認性の向上__：
ネストが多くなるコードでも、横方向への広がりを抑えつつ、しっかりと構造を示してくれます。
- __欠点らしい欠点がない__：
3スペースを否定する十分な要素は、4スペース・タブが圧倒的多数という点であって、合理的に考えると3スペースが最強なのではないでしょうか？圧倒的少数派という非合理的な要素が3スペース唯一の欠点ではないでしょうか？
- __個性の表現__：
他のスタイルに埋もれない独自性を発揮できるのも、3スペースの魅力。仲間内で話題になること間違いなし。しっかりしとしたアイデンティティを持ったエンジニアのように見えること間違いなし`(と、勝手に思っている)`。

## 3スペースだからこそできるコメントとの共存

行末にコメントを入れいたい場合、スペース4桁のインデントスタイルでは、コメントが右端に寄りすぎて読みにくい状態が発生します。
3スペースは、行末にコメントを入れても読みやすいという点が最高だと思っています。

```java:各行コメントの例(https://qiita.com/shunsuzu/items/e122c0bbd9d45ee504dbより引用)
try{
   File fileIN = new File(path);
   BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(fileIN),StandardCharsets.UTF_8));
   String line;
   String data[];
   String header[] = getCSVArray(bufferedReader.readLine()); //ヘッダ部を配列として取得
   while((line = bufferedReader.readLine()) != null){        //データ部を取得
      try{
         error = "";                               //error列の初期化
         data = getCSVArray(line);                 //データ部の文字列をCSVとして配列データに変換
         for (int i = 0; i < header.length; i++) { //列名をもとに
            setFieldVal(this, header[i], data[i]); //出力フィールドに各列の値を設定
         }
         generateRow();                            //データ行を生成
      }catch(Exception e){                         //例外発生時、error列に例外情報を設定
         error = "exception : " + e.toString() + ", data : " + line;
         try{
            generateRow();
         }catch(Exception ex){
            logInfo(error);
         }
      }
   }
}catch(Exception e){
   logInfo("exception in OnRowInput : " + e.toString());
}
```
実務でコーディングする時はコーディング規約に縛られつつも、Qiitaでコメントを打ちながらコード説明する時は3スペースを用いる。良いんじゃないでしょうか？

## 3スペースを熱弁している人が他にもいる件
オライリーのパロディサイトO RLY Booksにて、3スペース支持者がいらっしゃいました。

https://orlybooks.com/books/three-space-indentation

タイトル __3 Space Indentation__ に続く副題 __The only true indent__ もイイですね！

一番共感したのは __Why 3 spaces?__(どうして3スペースなの？)、に対する __Why not?__(じゃあ、なぜ3スペースじゃないの？)です。これが全てだと思っています。


## 結論
スペース3桁は、単なるインデントの手法を超えた存在です。それはコードを美しく、整然と見せるための、大多数が実践してこなかった新しいアプローチ。ぜひ一度、3スペースでコードを書いてみてください。その美しさに心を奪われることでしょう。

まずは、あなたが次に書くプライベートなコーディング、3スペースを試してみませんか？

## おわりに

ドラマ __シリコンバレー__ は、カリフォルニアのIT業界を舞台に、天才エンジニア・リチャードが仲間とともにスタートアップ企業を成長させる奮闘を描くコメディドラマです。

主人公リチャードはタブ派、しかもスペース8桁設定であり、そのこだわりは並外れています。彼は、なんと数年ぶりに自分に好意を寄せてくれた女性ウィニーを、彼女がスペース派だという理由だけで論争に発展させ、関係を終わらせてしまうのです(Season3 Episode6)。

インデントのスタイルひとつで友情や恋愛に亀裂が生まれる――そんな極端で笑える世界を描きつつも、このトピックはどこか「自分にも起こり得るかも？」と思わせるリアルさを秘めています。もしあなたが3スペースという新たな境地に目覚めたとしても、インデント論争が原因で恋愛や人間関係が破局するリスクを、心の片隅に留めておいてくださいね。