【若手向け】初心者にもできる！問題解決のための切り分け術

この記事は[VALU Advent Calendar 2019](https://qiita.com/advent-calendar/2019/valu)の12日目の記事になります。よろしくお願いします。

私は元々大手メーカー企業出身で、VALU社に入社して半年ほどになります。
担当業務はiOS、Android、フロントエンド、バックエンドです。~~あれ？~~

最近弊社若手エンジニアが問題解決に苦戦している様子を見かけることが増えたため、自分へのおさらいも兼ねてこの記事を執筆するに至りました。
もちろんベテランエンジニアの皆さまにおかれましては、今回書いた程度の切り分け術は当然のようにやっているかと思います。

なぜか文体が海外の技術書の翻訳っぽくなり、Qiita感がまるでありませんが、誰かのお役に立てば幸いです。

## 問題について

### 問題とは

本記事で扱う"問題"とは、ひとまとめに **"プロダクトが意図した通りに動いていない状態"** を指します。
それは、実装したコードのシンタックスエラーであったり、環境設定のミスであったり、データベースの誤った権限付与だったり、様々です。

問題は突然発生します。あなたが作業中に、もしくは何もしていないのに、一晩経つだけで発生することもあります。

### 問題は主に内部要因

外部のサービスを使っている場合、外部のサービスが落ちていたりすることが問題の原因である可能性もあります。ですが、昨日、もしくは1時間前まで動いていたものが急に動かなくなった場合、大抵は内部要因(== 自分自身、もしくはチームメンバーの変更によるもの)です。

### 内部要因では、変更が問題の原因になる(場合が多い)

内部要因で起きる場合、今動いている環境を変更することになった際に発生します。

- 新しい機能を追加する、既存機能を改修する、リファクタリングするなど、コードの変更
- ローカル、もしくはコンテナの設定ファイルの変更
- (何かをしたことによる)キャッシュの変更

などなど
それは自分自身の意図した/意図していない変更で問題を起こしてしまった場合かもしれないし、チームメンバーの変更を完全に取り込めていないのかもしれません。

## 問題が起きた時にあなたがやるべきこと

### 落ち着く

あなたがコーヒーが好きなら、コーヒーでも飲みましょう。音楽が好きなら、Youtubeで好きなアーティストの曲を探して再生しましょう。

問題が発生すると、人は混乱し焦ってしまい、さらに良くない問題を引き起こす可能性があります。
まずは心を落ち着かせ、冷静に問題に当たることが大切です。

落ち着くことが許されない職場ではどうすればよい？~~辞めればいいんじゃないっすかね~~

### 今の状況を確認する

問題が起きてしまった時、まずは一旦自分の状況を整理してみましょう。

- 問題が発生するまでに自分がやっていたこと
- その問題は深刻そうなのかどうか (わかる範囲で)
- その問題を解決するのにどれくらいかかりそうか

### (時間がかかりそう/わからないなら)上司に報告する

特に新卒1年目ぐらいであれば、慣れないうちは闇雲に上司に報告してもよいでしょう。ですが、せめて**問題が発生するまでに自分が何をやっていたのか**はしっかり報告できると、受ける方も答えやすくなると思います。
そして、上司に報告しなくても自身でスムーズに解決できるようになることが、良いエンジニアになることの条件です。

## 問題を切り分けるためにやること

### エラーメッセージを読む

若手エンジニアにはエラーメッセージが嫌いな人も多いと思います。実際わたしもエンジニアになりたての頃は、あの赤い英語のエラーメッセージを出されるのが怖かったです。

実はエラーメッセージが出ているということはとてもありがたいことです。世の中にはエラーメッセージすら出してくれない、複雑な問題も多くあります。エラーメッセージが出ているということは、あなたが起きている問題の解決のための手順を示してくれています。
ですので、**エラーメッセージはきちんと読みましょう。**英語が読めなければGoogle翻訳にお願いしてみましょう。

ちなみに、エラーメッセージを全く読まないで上司に相談すれば怒られます。当たり前です。(エラーメッセージを読んでみても、意味がわからなければ相談してみましょう)

### 差分を見る

あなたが問題が起きている時の状態と、正しく動いている状態には必ず何かの差分があります。

もちろん本番の環境や他者の環境に全てを合わせることはできません。ですが、自分の環境内であれば、動いていた状態と問題が発生している状態は比較できます。
**問題が発生した時とそうでない時で、どんなコード差分や環境差分があるのか。または、実装した他者の環境と自分の環境でどんな差分があるのか、確認しましょう。**その差分の中に、問題を解決するためのヒントは眠っています。

ちなみに、差分を見る、という力はどんな時にも役に立ちます。

- キャリア差分
  - なりたい自分がある場合、現在の自分を比較して、差分を埋めるためにどうするか？を考えていくとイメージがつきやすい
- 機能差分
  - ある製品と、他者製品を比較し、機能の差分を確認する
  - ものを買う時に、値段以外の比較がしっかりしてる人はエンジニア力が高いかも？？

### 範囲を絞る

コードの全てを把握しているベテランエンジニアであれば、即座にエラー箇所がわかるかもしれません。しかし、あなたが新人であれば、複雑に絡み合った機能のどこが問題なのかを特定することは難しいです。そこで、**問題が起きている原因の範囲を絞る**、ことが大事です。

範囲を絞るというのはとても地道な作業です。もっとも簡単ですぐにできる方法は、**ログを仕込んで確認する方法**です。
まずは広い範囲でログを仕込み、問題が発生する前後のログを確認します。そして、さらにその中に細かくログを仕込み、問題が発生する前後のログを確認します。これをなんども繰り返すことにより、問題を特定することができます。

楽して問題解決したいと思っても、現実はそう上手くいかないものです。地道でも確実な方法こそが、問題解決においてはもっとも重要視されるべきだと思います。

## 問題が解決したら

### 解決手段をどこかに残す

同じ轍を踏まないため、もし解決手段が役立ちそうだと感じた場合は、どこかに残します。

- ローカルフォルダにメモを残す
- Qiitaやブログに解決手段を残す

### リスケする

問題解決までに多くの時間を費やしてしまった場合、当初想定されていたスケジュール通りに作業が終わらない可能性が出てきます。
その場合は、上司やマネージャーに相談し、スケジュールの見直しを行いましょう。
なお、スケジュール通りというのは基本的には残業なしで換算した場合です。無理して残業すればなんとかなりそうという場合も、独断でやらずにきちんと報告しましょう。

### 協力してくれた人にお礼をいう

問題解決のためにあなたに協力してくれた人は、直属の上司だけでなく、別部門の人がいるかもしれません。みんな貴重な時間を割いて協力してくれていますので、簡易的にもお礼を言っておくと、相手からも好感を持たれます。

## 例

ここでは、実際にあった問題の例の解決方法をみてみます。(大した問題ではないです。)

#### 前提条件
Larabelで開発中

#### 問題
チームメンバーが実装したコードをチェックアウトし、該当のページを表示しようとしたら404エラーになった

#### 原因

新しく作成されたデータベースに、初期データが設定されていなかった

#### 解決方法

1. まずはエラーメッセージを見る (エラーメッセージを読む)
  - コンソールのエラーメッセージ上では404が表示されていた。
  - どこでエラーが出ているかは特定できなかった。
  - 404なので、例外が出ている可能性はありそう。
2. 全体が動いていないのか、新規部分だけ動いていないのか確認する (範囲を絞る)
  - 他のページやAPIは動いていた。該当のソースコードや新規実装部分だけに問題があることがわかった。
3. ログを仕込んでみて、どこから動いていないのか探る (差分を取る、範囲を絞る)
  - ある行以降が動いていないことがわかった。
  - その行では初期データを取るような動きをしている。
  - `php artisan migrate`でデータベースはmigrationしていたが、初期データを登録していなかった。
  - 初期データを登録し、無事に動いた。



## 最後に

これを書いているわたしも、問題の切り分けのやり方が染み込むまで2年ぐらいはかかったかなと思っています。書いてあることはとても単純ですが、実際にスムーズに問題解決できるようになるまでは時間がかかります。今できない人も、徐々に日々の問題を解決しながら、自力で問題解決ができるようになりましょう。