プログラムコードのインデント論争!タブ?それともスペース?どちらが正解?

問題が発生したため、プログラムが正しく動作しなくなりました

プログラミングの世界で古くから激しく行われている論争があります。それは、プログラムコードを書く際、各行の字下げ(インデント)にスペースを使うか、タブを使うかという問題です。

コーディングとは無縁の人たちからすると「どっちでも好きな方使えばいいじゃんw」って話ですが、実はそう単純な問題ではなかったりします。だって、みんな頑固で自分のやり方がBESTだと思っているからね(笑)

インデントはタブかスペースか

海外ドラマ『シリコンバレー(Silicon Valley)』でもこの話題が登場しています。このドラマでは、主人公はタブ派なのに彼女がスペース派だったため、別れる事になるという悲劇が起こってしまいます…

う~ん、これは大問題ですね(笑)。でもこれ、笑い話に見えて、実際の開発現場でもけっこう根深いテーマなんです。

タブ派とスペース派、どちらが多い?

スペースの大きなメリットはどんな環境で開いても字下げ幅が変わらず、見た目が崩れない点。一方タブのメリットは1回打つだけで楽にインデントを揃えられて、ファイルサイズも小さく済む点です。

両派それぞれ言い分はありますが、どちらを使っている人が多いかは調査で明らかになっています。

これは研究のテーマにもなっている。例えばグーグルのある開発者が、10億ものプログラムファイルを分析し、どちらの方法がプログラマーから好まれているかを調べたことがある。結果は、スペース派の圧勝だった。

そして今回、スペース派はさらにリードを獲得しているようだ。開発者相互のQ&AサイトStack Overflowの分析によると、スペース派はタブ派に比べて、より高い収入を得ているというのだ。Stack Overflowは毎年、大規模な収入調査を実施している。今年は、アンケートの質問に、スペースかタブのどちらを使うかという項目を加えた。収入アンケートに参加した1万2000人のプログラマーから、回答が得られた。

LINK:スペース派 vs タブ派、どちらのプログラマーが稼いでいる?

データ上は「スペース派」の圧勝。GitHubで公開されている人気ファイルの多くもスペースが使われているようです。ソフトや環境に左右されず、誰が開いても同じ見た目になるというのは、たしかに大きなアドバンテージですよね。

ちなみに私は収入が低いとされる「タブ派」です(笑)

タブでのインデントに慣れているというのもあるし、1人で完結するプロジェクトが多くてソースを共有する機会が少ないから、というのが正直なところ。ただ、世界的な流れを見ると、いつかスペース派に移行した方がいいのかな…とは思っています。

実は「言語ごとに答えが決まっている」ことも多い

この論争、個人の好みの話として語られがちですが、言語やその文化圏によって「事実上の正解」が決まっているケースも多いんです。代表的なところを挙げてみます。

  • Python…公式のスタイルガイド「PEP 8」がスペース4つを推奨。タブは既存コードとの整合性を保つ場合を除き使わない、と明記されています。
  • Go(Golang)…付属の整形ツールgofmtタブに自動で揃えます。Goを書くなら基本タブ一択です。
  • JavaScript / TypeScript…言語仕様としての決まりはありませんが、実務では整形ツールのPrettierを使いスペース2つにするプロジェクトが多い印象です。

こうして見ると、「タブが正解/スペースが正解」と一言で片付けられる話ではなく、書く言語やチームの方針で答えが変わるのがわかります。私のようなタブ派でも、Pythonを書くときは素直にスペース4つにしますし、そこは郷に入っては郷に従え、ですね。

現代の実務的な結論は「ツールで自動的に統一する」

では、いま現場ではどう折り合いをつけているのか。答えはシンプルで、そもそも人間が手で気にしないようにする、というのが主流になっています。

よく使われるのが次のような仕組みです。

  • EditorConfig…プロジェクトに.editorconfigという設定ファイルを置くと、エディタ側がタブ/スペースやインデント幅を自動で合わせてくれます。多くのエディタが標準対応しています。
  • Prettier などのフォーマッタ…保存時にコード全体を設定どおりに自動整形。誰が書いても最終的に同じスタイルになります。
  • Lint(ESLintなど)…ルールから外れた書き方を警告・自動修正してくれます。

つまり「個人がどっち派か」ではなく「チームでルールを決めて、あとは機械に揃えさせる」のが現代のスタンダード。設定を1回決めてしまえば、レビューで無駄なインデント指摘をせずに済むし、意味のない差分でmerge conflict(マージの衝突)が起きるのも防げます。

タブを推す「アクセシビリティ」という視点

ちなみに、スペース優勢の流れに対して、近年あらためて注目されているのがアクセシビリティの観点からタブを推す声です。

タブは「1段の字下げ」という意味だけを持ち、実際の表示幅は読む人のエディタ設定で自由に変えられます。人によっては、視認性の都合でインデント幅を広くしたい、あるいは狭くしたい場合がある。スペースで幅を固定してしまうとそれができませんが、タブなら各自が読みやすい幅に調整できる、というわけです。

この「幅を強制しない」という性質は、フォントサイズや配色を各自で選べるのと同じで、たしかに理にかなっていますよね。多数派はスペースでも、タブにはタブの筋の通った言い分がある、ということです。

結局どちらが正解なのか

「インデントにタブを使うかスペースを使うか」に、万人共通の絶対的な正解はありません。ですが、いまの実務をふまえるとこんな整理になるかなと思います。

  • 書く言語に慣習があるなら、それに従う(PythonはスペースPEP 8、Goはタブ、など)
  • チーム開発なら、まずルールを1つに統一する
  • あとはEditorConfigやフォーマッタで自動的に揃え、人間は中身に集中する

熱くなれる論争ネタとしては今も面白いテーマですが、現場の答えは「どちらか論破する」ではなく「統一して自動化する」に落ち着いている、というのが正直なところ。とはいえ心情としては、私はやっぱりタブが好きですけどね(笑)