ソフトウェア開発における当たり前を教わることがない件


僕はふと思いました。
「ソフトウェア開発現場で当たり前に行われているバージョン管理やCIについて先輩などから教わることってほとんど無くない?」
現代では当たり前に使われているgitやCircleCIなどの使い方は教えてもらっても、どんな目的で存在していて、何に気を付けて活用すればよいかを説明してくれる場が少ないと思ったのです。

かく言う僕も、「git使ってるから使えるようになってください」とか「リポジトリにpushしたらJob動くんで覚えておいてね」で済まされてきたため、なんとなくこれらのツール使っていました。

僕はこれらの意義や誕生した経緯をt-wadaさんの「動作するきれいなコード」という公演で、恥ずかしながら初めて意識するようになりました。ので、この記事では自戒の念も込めて覚書しておきます。

バージョン管理・テスティング・自動化

t-wadaさんは、現代のソフトウェア開発においてなくてはならない技術的な柱としてこれら3つを挙げています。
確かにどこの現場でも、しっかり運用できているかは別として必ず上がっている要素だと思います。

これら3つは、あれば優位なわけではなく、無ければ話にならないという要素です。

バージョン管理

バージョン管理は人間の記憶力を補います。
実装から半年も経てばどんな変更を実施したのかなど忘れてしまいます。僕みたいなポンコツは1か月後には完全にゼロに戻っています。
そこで、コードのどこをどのように変更したのかや誰が実施したのか、何のために変更したのかをバージョン管理システムが歴史としてしっかりと記憶してくれます。
このような目的を改めて理解すると、
* コミットメッセージを「fix」で済ます
* カジュアルな歴史改変
のようなことをしなくなりますよね。

また、開発時にもいろいろ変更を加えた挙句、「一旦ゼロに戻したいなぁ」ということがgit resetgit checkoutのようなコマンドで簡単にできます。
これも歴史のチェックポイントをバージョン管理システムが覚えていてくれるからこそ成せる業ですよね。

テスティング

テスティングによって、人間の把握力を補います。
テストを書き続けて、継続的に実行することで、膨大なコード量になっても「想定通り正しく動作しているか」を判断することができます。
想定通り正しく動作しているかをテストの成功失敗をもって明確にわかることで、次のコード改修も安心して実施することができます。

実装当時のように仕様がバッチリ頭の中にあるわけではないけれども、その当時考えていた通りに動作しているかどうかがわかれば、変更の細部はバージョン管理システムに問い合わせれば教えてもらえます。

個人的経験もありこれはかなり意識するようになりました。ほぼメンテされていないintegration testを1発たたいて、気持ち的に少し安心感を得るだけで本番デプロイしていた時期があり、精神衛生上とても良くないと思った経験がありましたもので。

自動化

自動化は人間の忍耐力を補います。個人的には注意力も補ってくれていると思います。まぁ一緒でしょうかね。
開発にあたって、コーディングだけをしていればよいわけではなく、当然テスト実行やそのレポート出力、ビルド、パッケージングなどの周辺作業が伴います。
これを手順書化して人間が逐一実行するのはちょっとイケてないです。
このような単純作業を変更のたびに繰り返すのは、つまらなくて飽きますし、何よりもミスする可能性があります。その点で機械はミスなく言われたとおりに実行し続けることができます。

そうであるならば、手順書からスクリプトやパイプラインを作成してやらせればよいです。これによって人間が作業することで起こるケアレスミスもなくなり、開発サイクルのスピードも速くなります。

また、変更の有無にかかわらず定期的にビルドやテストを実行することがあります。これにより、失敗したときに素早く知れるとともに、「何もしていないのに壊れた」状態を検知することができます。

おわりに

僕はテスト駆動開発という本を読んで、それをきっかけにt-wadaさんの講演にたどり着きました。
テスト駆動開発についての講演でしたが、それに限らず界隈の方にはぜひとも1度触れてほしい講演です。

参考文献

動作するきれいなコード: SeleniumConf Tokyo 2019 基調講演文字起こし+α
https://t-wada.hatenablog.jp/entry/clean-code-that-works