難しいモノをあえて簡単にしない

「Git のコマンドはサブコマンドが多く、概念が複雑で分かりにくい」とか、「本番環境のサーバは IP 制限がある上にポートフォワードしないと接続できない」とか、

そういった難しく・面倒で・分かりにくいモノは、簡単にしようとすると危険である、という話。


例えば、Git の操作を簡単にできる GUI ツールなんかは多々ある。VSCode なんかの左下にも、リモートリポジトリとワンクリックで同期するためのボタンが付いていたりする。git fetch master などとコマンドを入力するより、簡単で分かりやすくなっている。

しかし、ウッカリ誤って「一発同期」みたいなボタンを押してしまうと、編集中のファイルがリモートに Push されてしまったりする。さらに悪いことに、feature ブランチではなく master ブランチを編集していたことにも気付かず、開発中の資材が本番環境用のソースに紛れ込んでしまったりしかねない。


「なんで本番サーバにアクセスするのにこんな手間がかかるんだろう…。踏み台なんか用意せず直接アクセスできたらいいのに…

初心者の内は、どうしてそんなに面倒な構成になっているのか、その重要性になかなか気付けない。技術的には直接 SSH 接続できるのに、何やら制限がかけてある。頻繁に本番作業をするのだから、ポート開放しときゃいいじゃないか、などと思ってしまったりする。

当然、コレをやってしまうと、自分が簡単にアクセスできるのと同じように、クラッカーも簡単にアクセスできるようになってしまう。


チェスタートンというイギリスの批評家の言葉がある。

なぜフェンスが建てられたのか分かるまで、決してフェンスを取り外してはならない

一見「フェンスなんかあったら通行の邪魔じゃないか」と思うかもしれないが、その面倒臭さを選ばせる理由が、少なくとも当時はあったはずなのだ。だから、「どうやらこういう経緯でフェンスがないと危険らしいぞ」という理由が判明するまでは、無闇に取っ払ってはいけないよ、ということだ。

Git の一見複雑そうなコマンドは、ブランチごとのバージョン管理を厳格に行い、効率よくマージするために練り上げられた設計思想の基に成り立っている。GUI ならボタン一つで同期が完了するが、その裏には色々な経緯を経て実装された複数のコマンド相当の処理が隠蔽されている。それぞれのコマンドの意味を理解して、自分でコマンドを入力して操作していればミスを起こさなかったものを、理屈も知らずにボタン一つで操作できる手軽さに飛びついてしまったばっかりに、取り返しのつかないうっかりミスをやらかす危険性があるのだ。

セキュアな構成は、得てして面倒臭い。アクセスする経路が限られていたり、正しくアクセスするための認証が難解だったり。しかしそれにより、本番環境と開発環境を取り違えないようにするとか、本番環境を外部の者に絶対触らせないようにするとかいう狙いがあるはずだ。

勿論、「組織のしがらみで、必要ないけどやっていること」とか、「途中で考え方が変わって、今となっては意味をなさなくなったもの」も、中にはあるかもしれない。しかしほとんど大抵の場合は、必要だからそのような難解さで存在しているはずなのだ。

そもそも、自分より賢い多くの人達がよってたかって考えて作り上げたモノを、素人の自分一人がザッと見ただけで気が付くことなんて、設計者はとっくに考慮済みなのである。だから、「何でこんなに分かりにくいんだ、こうやって簡単にすりゃいいのに」と思ってしまった時は、一度立ち止まり、どうしてそのように複雑でなければならなかったのか、理由を考えることが大事だ。

相当に調べて、検証して、それでもなお「この複雑さは取っ払ってしまって問題ない」と判断が付くなら、あなたの責任で改変していい。そうでなければ、複雑なモノは複雑なまま受け入れることが必要だ。