🤔

「取り返しのつかないことをしない」

2022/07/31に公開

「取り返しのつかないことをしない」

昔、同僚と議論していて口走った言葉です。実はプログラマーとして非常に重要な考えなのではないかと思います。

例: 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リリースでも半年経たずに「初めからテストを書いた方が安上がりだった」状態に達することになります。

https://speakerdeck.com/twada/quality-and-speed

その他「取り返しがつかないこと」

  • Pythonの依存性パッケージを管理していない。pipenv? pip? そんなの知らないよ、僕初心者だもん。
  • 1人プロジェクトだからとScalaでコードを書いたら、社内にScalaを書ける人がおらず、プロジェクトに縛り付けられた
  • バグを放置していたら、ユーザーが「バグを前提にした利用」をし始め、バグを直せなくなった
  • 小規模だからと IoC化せずWEB画面からリソースを作っていたら、全体像が分からなくなった。

「取り返しのつかないことをしない」とは

言い換えれば 「目先のコストを厭ったり、目先の利益を追ったりして、長期的な負債を抱えるなかれ」 ということなのかもしれません。

そして、「取り返しのつかないこと」を避けるのは、大抵、難しいことではなさそうです。

なんでこんな記事を書いたの?

お風呂に入ってボーッと今までの仕事のことを考えていたら、突然、この台詞を思い出しました。今となっては、どんなシチュエーションで誰に言ったのかも曖昧です。

Discussion