それ、「細分化」できるかも！

## はじめに

昨今、人工知能の発展により、単純な作業の需要が激減し、難解で不明瞭な課題に立ち向かう力がますます必要となっています。しかし、未知の課題に対してどのようにアプローチすればよいのでしょうか。
今回は**細分化**について、そしてその実際の活用方法をご紹介します。


## 細分化していますか？

プログラミング中に次のような経験はありませんか？

* 不具合が発生したが、どこに原因があるのか全くわからない
* 関連情報を調べても時間ばかりかかってしまう
* 相談しても「質問の粒度が荒い」と言われる

これらは**問題点の細分化**ができていないことが一因です。
原因箇所とそうでない箇所を同時に広い視野で捉えてしまっていませんか？こうした状況を解決するために**細分化**が重要です。

## 細分化のメリット
細分化には次のようなメリットがあります。

### 問題点の縮小化
問題のスケールが小さくなります。プログラムの全要素が原因であることは基本的にありません。細分化を進めることで問題点を明確にし、より部分的な箇所にフォーカスを当てることで解決がしやすくなります。

![unnamed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652287/52849a65-df4f-cdc6-45d0-c6599d3b26e8.png)

### 頭が整理される
「不具合が起きたが原因がわからない」という状況は脳のリソースを圧迫します。
細分化を行うことで、必要なリソースだけを使うことができるため、冷静に、且つ効率よく業務を進められるようになります。

### コミュニケーションコストが最小限で済む
問題が起きている状況を「掃除機が動かなくなった」に置き換えて質問してみましょう。

質問者「掃除機が動かなくなってしまいました。」

とだけ質問されても、

相談相手「まず家に電気は通っていますか？」

質問者「通っています」

相談相手「では、コンセントにプラグは挿さっていますか？」

質問者「挿さっています」

相談相手「では、プラグの先端は曲がっていませんか？」

質問者「曲がっていません」
相談相手「では...」

と、1から洗いざらい質問せざるを得なくなり、その分キャッチボールの回数が増えていきます。結果として解決したとしても莫大なコミュニケーションコストがかかってしまい、相談をしている時間だけ相手の時間も奪ってしまいます。それがどのような影響を及ぼすかは容易に想像できると思います。
ですが、細分化をすることによって

質問者「掃除機が動かなくなってしまいました。フィルターとノズル掃除、ブラシとローラーの詰まり確認、ごみパック交換、電源ランプによる通電確認を試しましたが、いずれも効果がありませんでした。」

と質問内容がより具体的になり、相談相手はその部分を放念することができるため

相談相手「なるほど。それでは、モーターに問題があるかもしれません。」

と先ほどよりもキャッチボールが少なく、且つより詳細な部分での受け答えが可能となるため、コミュニケーションコストが必要最低限で済みます。

![unnamed (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652287/466b8b54-2af0-b0bb-ad59-2309045b7177.png)


## 「細分化」のコツ

私が日々の業務での不具合対応の際に活用する細分化のテクニックをご紹介します。

### エラー文を読み解く
実行結果で急に英語長文のエラーが大量に出力されると、思わずギョッとなりますよね。
ですが、そんな気持ちをグッと堪えてエラー文を読んでみてください。
エラー文は多くの場合ヒントが含まれており、場合によっては答えが記載されていることもしばしばあります。
エラーの内容をキャッチアップすることで、どのファイルが原因なのか、どのような不具合を引き起こしているのかを理解することができます。

### コメントアウトして調査する
コードを一行ずつコメントアウトし、正常に動作する部分と不具合が発生する部分を特定しましょう。かなり地道な作業ではありますが、確実に問題を切り分けることが可能な方法でもあるため、非常に有効です。

### 出力を確認する
`echo`や`var_dump`、`console.log`などを利用して、不具合に関わる変数や配列などがどの行まで正常に出力されるかを確認しましょう。
そうすることで、具体的にどの行の処理が不具合の原因に関連しているのかをさらに細分化できます。

### ミニマルな環境を作成する
上記のコメントアウトである程度の行が絞り込めたら、今度は**必要最低限のファイルおよびコードが含まれており、なおかつエラーが再現する環境**を作成してみましょう。
WordPress環境での不具合では、プラグインやテーマ、パーマリンクなどが原因になっている可能性もあるため、ミニマルな環境を作成することでその部分の絞り込みも行うことが可能です。

### 対応手順を作成する
先ほどの掃除機の例で言うと、もちろん一発で完全修復するに越したことはないのですが、

1. 関係のないパーツは外し、電源ランプがつくようにする
2. スイッチを入れたときに掃除機が吸引するようにする
3. 全てのパーツをつけても変わらずに掃除機が吸引するようにする

のようにいくつかの手順に分けて対応を進めることで、今自分の目指すべきゴールまでの道筋がより鮮明になります。

## とはいえそんなものばかりではない
ここまでは不具合が発生したという想定で細分化のテクニックを紹介しましたが、

* パニックゾーン(自分の能力が全く通用しない領域)の課題
* 要件の策定(使用言語や全体の段取り、行動方針など)

というような、**課題そのものの抽象度や、課題に対する理解の抽象度が高く、細分化の方法すらパッと浮かばない課題**が出てくることがあります。
そういった困難にはどのように立ち向かうべきなのでしょうか？

### 細分化の進め方に関する相談はネガティブではない

> 突然だが、今からアイドルになって頂点を目指してくれ

これと同じ指示がくることはまぁないと思いますが~~来た場合は大人しくアイドルになってください~~、上記のような**ナレッジが一切通用しない、イメージすることも困難であり、手順が一切浮かばない**という課題に直面し、細分化の方法すら浮かばず、自分が何をすべきかどうかすらわからない状態において、すぐに相談することは決してネガティブではありません。
相談された側もこの段階での相談であれば納得してもらえるでしょうし、相談することもなく関連していそうな知識やノウハウをがむしゃらに調べ、結果として湯水の如く時間を浪費する事態を避けることができます。
ですので、**細分化そのものの方法、手順を聞く**という趣旨の質問はできるだけ早く投げかけるべきだと思います。が、だからと言ってあまりにも抽象的な質問を投げても良いということではなく、回答者にとって**何に対して困っているのか**がわかりやすい質問を投げかけることが大事だと思います。

## まとめ

今回は、細分化について、また自分が業務において活用している細分化のテクニックをご紹介しました。
「他にもこんな方法でやってるよ」や「このやり方おすすめだよ」といった細分化テクニックをご存知の方は、コメント欄にてご教示いただけますと大変助かります！