2019-02-12こんにちは。ソフトウェアでは不具合はバグとよばれます。どんなシステムでもバグがあります。最近、小さいサービスでもフェイスブックのような大きいサービスでもよく不具合が発生しています。これは一体、なぜでしょうか?バグの原因2013年のIBMの記事の通り、ソフトウェアはどんどん複雑になりつつあるということがわかります。現時点でもこの視点が間違いないでしょうか?ソフトウェアはどんどん多くのことができるようになり、ユーザの操作が少なくなります。使用用途が増えると、ソフトウェアの複雑さも高くなります。ソフトウェアは複雑になる程、修正が難しくなります。依存関係が増えて、複雑さも増して、結果としてデバッグが大変な作業になってしまいました。Cambridge」の大学の研究によると、開発のコストの30%がバグ対応、開発時間の50%は新しい機能を実装ではなくてバグの修正です。やってデバッグしやすくするか普段のデバッグには二つのフェーズがあります。調査のほうが難しく時間もかかります。そのため、Googleには「バグを隠すより見つかりやすい方がいい」と言う文化があるほどです。私もそうだとおもいます。テストフェーズでたくさんのバグができたら本番のプロジェクトのバグが少なくなることです。プログラミング言語は大きく分けて2つの種類があります。コンパイラ型とインタープリタ型です。コンパイラ型の場合はコンパイルするとき見つかったバグが多ければ多いほどいいです。コンパイルする時点、トレースバックとか再現させることを考える必要はないから修正するのはすごく簡単です。a);}これはコンパイルできるがaがnullになってしまいます。これはバグが発生する可能性が高いです。Rustで書き直します。以下の書き方を見ましょう。a);}これはコンパイルしたらエラー発生します。これはすぐ確認して修正することができるため良いコードです。`a`他のケースで、例えばhoge、piyo、fugaというメソッドがあってhogeの中でpiyoが呼ばれる、piyoの中でfugaが呼ばれる。fugaのメソッドの中にバグがあったらhoge、piyoも正常に動作しないことでしょう。これはunitテストでカバー出来るが、もしカバー出来ない場合はruntimeで発生する時はhogeの中の時か、piyoの中時でもあります。デバッグではトレースバックが必要です。Rust言語だったらメソッドの定義をするときどんなparamの値があるか確認するコードが必要です。するとfugaのバグがあったら最悪でもpiyoでエラーが発生します。hogeで発生することはないです。コードはSOLID原則を必ず守らないと効果がありません。SOLIDのS(単一責務の原則)です。バグ発生率はどうしてもゼロにすることは出来ない。バグが発生した時にどうすれば良いでしょうか?理想的には、不具合がある箇所をソフトウェアが自動的に修正することです。今の技術段階ではまだ難しいです。不具合が発生した時点の情報を出来るだけ集めてレポートを担当者に送って人間で修正するというフローは悪くないです。保存しておく障害時のログ情報は多ければ多いほどいいですが、その保存した生のログファイルは人間が読むものではないです。トラブル発生時に必要な情報を自動的に判断し、まとめてレポートとして人に送ることで調査時間を節約できます。まとめ新しいコードを反映しなければ新しいバグは発生しませんし、ユーザ数が増えなかったらスケールは必要じゃありません。バグを恐れずに開発できたら最高です。エンジニアたちはバグを食べざるを得ず、逃げることなどは出来ないが、ちゃんと切って、煮て、お皿に盛れば、食べてもお腹が痛くなることはないでしょう。Hacking!株式会社ベーシックエンジニア募集QiitaWantedly。