「取り返しのつかないことをしない」
昔、同僚と議論していて口走った言葉です。実はプログラマーとしてわりと重要な考えなのではないかと思います。
例: EC2のパブリックIPをスマホアプリに直書きする
スマホアプリ向けの静的ファイルやバックエンドAPIをAWSに実装した際、最初はスモールスタートだと言うことでEC2インスタンス1台の構成にしたところまではいいが、インスタンスに自動で割り当てられるIPアドレスをスマホ側で直接参照する実装にしてしまった。
こうなると、AWS側はアーキテクチャを変えるどころか、EC2インスタンスを再起動することすらできません(再起動するとIPアドレスが解放されてしまう)。スマホアプリをアップデートして、IPアドレスを直接参照するのを止められればいいのですが、一度公開したアプリを100%アップデートするのは事実上不可能です。
最初にRoute53でホスト名を解決するか、せめてEIPを使ってIPアドレスを再利用できるようにしていれば…
例: 大量のBashスクリプト
顧客向けの請求レポートを日次で作ることになりました。簡単な集計をしてメールを送るだけなので、sqlplusコマンドでSQLを実行し、sendmailコマンドを実行する、Bashスクリプトを書きました。顧客はせいぜい数社なので、受注するたびスクリプトをコピペで増やしていました。
数年後……そこには、千個を超えるバッチ処理スクリプトの群れが!しかも、顧客ごとに微妙にカスタマイズされており、1つとして同じものはありません(より正確には、同じものがあるのかどうかも分かりません)。
ところで、DBをオンプレのOracleから Amazon RDS for PostgreSQLに移すことになったのですが、一体どうすればいいのでしょう。
例: グローバル変数を使う
古典的&マイクロな話題としては、グローバル変数を使わない「取り返しのつかないことをしない」ためです。
一度使われたグローバル変数を廃止するのは、大抵コード全体の構造を変える必要が出てきて、困難な作業になります。
例: テストを書かない
テストが無いコードはレガシーコードだ!
テストがあれば、本体のコードが汚くても、比較的容易にリファクタリングすることができ、リグレッションの恐れもありません。逆にテストが無いと…。
また、実際のところ、最初からテストを書いて品質の良いコードを書いた方が最終的な開発効率は上がります。それどころか、テスト自動化の損益分岐点は4回であり、月1リリースでも半年で「初めからテストを書いた方が安上がりだった」状態に達することになります。
その他「取り返しがつかないこと」
- Pythonの依存パッケージを管理していない。pipenv? pip? そんなの知らないよ、僕初心者だもん。
- 1人プロジェクトだからとScalaでコードを書いたら、社内にScalaを書ける人がおらず、プロジェクトに縛り付けられた
- バグを放置していたら、ユーザーが「バグを前提にした利用」をし始め、バグを直せなくなった
- 小規模だからと IoC化せずAWSコンソール画面からリソースを作っていたら、全体像が分からなくなった。
「取り返しのつかないことをしない」とは
上で挙げた「取り返しのつかないこと」の例は、ちょっと時間を掛けて予習したり相談したりすれば、避けられた問題が多いようです。
なので、「取り返しのつかないことをしない」とは言い換えれば 「目先のコストを厭ったり、目先の利益を追ったりして、長期的な負債を抱えるなかれ」 ということなのかもしれません。
そして、「取り返しのつかないこと」を避けるのは、大抵、難しいことではなさそうです。
なんでこんな記事を書いたの?
お風呂に入ってボーッと今までの仕事のことを考えていたら、突然、この台詞を思い出しました。今となっては、どんなシチュエーションで誰に言ったのかも曖昧です。