[研究室向け]なぜ君はソースコードのエラーを自分で解決できないのか？

# 1. Intro
## 1.1 タイトルの答え
それは，最初から"How"(どうやってこの問題を解決すべきか)だけを考えているからです．

最初に問うべきなのは"Why"(なぜこの問題が起きたか)です．

このタイトルの問いも，なぜ？から始まっています．「どうやって自分でエラーを解決するか」だけを考えていると，問題の根本的な原因が分からないため，ずっと自分でエラーを解決することはできません．

## 1.2 Keyword
最初に自分に問いかけるべき言葉

〇 **Why(なぜ？): なぜこの問題が起きたか**

✕ How(どうやって？): どうやってこの問題を解決すべきか

## 1.3 背景
研究室では毎年，いつまでたっても自分でソースコードのエラーや出力の問題を解決できず，進捗が遅かったり開発をあきらめてしまったりする人が発生する．本記事では，なぜ自分でエラー・問題を解決できないのか？を明確にする．

<注意書き>
この記事は人に質問することを否定するわけではなく，**「自分+他人の合計時間」をいかに少なくしてエラー・問題を解決するか**に焦点を置く．

## 1.4 対象
研究室1年目

# 2. ソースコードの問題解決手順
## 2.1 5W1Hの手順
自力でソースコードのエラーやミスが解決できずにすぐに人に聞いてしまう人は，大体"How"(どうやってエラー解決したらいいですか?)と聞いてきます．そして大抵の場合，エラー文をちゃんと読んでいないか，以下の図に示す作業(デバッグ)ができていないかです．
![qiita.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1294864/331c8150-0e3a-f002-b555-f4ddcba7b0e1.jpeg)

## 2.2 問題解決までの流れ
（準備）
自分が動かしているソースコード，設定ファイル，エラー文，出力結果を控えておく

（問い）
**Why?：なぜこの問題・エラーが起きたのか？**

（問いの答え）
When?:どのバージョンで
Where?:どのファイルの何行で
What?:関数が，変数が，記号が
スペルミスしているから，文法に合っていないから，引数が間違っているから

（解決方法）
How?: どのように修正するか？

<font color=red>[Whyの答えや，Howの内容がわからない場合]</font>
（質問）
Who?: ネットで調べる？ChatGPTを使う？誰に聞く？
→これまでの状況証拠や，原因調査をできるだけ示す．
→もし，これまでの思考過程で抜けているところがあれば指摘してもらう．

<font color=green>[Howが分かった場合]</font>
Fix: 修正作業
Output: 出力結果を確認する

エラーがまだ出力される,または出力結果が正しくなければ，ひたすらDebugを繰り返す

## 2.3 質問の仕方
2.2の"Why, When, Where, What"を明らかにして初めてHowはわかるものです．

従って，"Why,  When, Where, What"を何も示さずにHowを質問するということは，相手にこれらを探らせる時間をとらせる（相手の時間も奪う）ということです．

他人への質問は，**状況証拠の所在を把握し**，**自分でDebug作業を行い**，**ネット等で自力で調べたうえで**行うようにしましょう．

これらのどれかが欠けたまま"How"を聞くと，相手はいちいち"How"以外の事項を確認しなければなりません．

頻繁に他人に質問する人は，**あやしいと思う箇所の値の出力or確認**を怠っていることが多いです．
"Where"(どこが原因となる箇所か？)の範囲が一か所に特定できない場合は，**関連する箇所を地道に隅々まで出力して**みましょう．

## 2.3 ChatGPTでエラーを解決できるのはどいういうとき？
初歩的な文法ミスであれば，"Why,(when,) Where, What"は，基本的にエラーコードに全部書いてあります．※whenはバージョン依存の場合のみ

従って，ChatGPTにエラー文を投げると，どのように直せばいいか（How）が返ってくるのはこのためです．"Why, (when,) Where, What"を自動で読んで的確な解決策を導いてくれるのです．

逆に，"Why, (when,) Where, What"が書かれていないものをChatGPTに投げても的確な答えは返ってきません．

# 3. 質問相手への配慮
## 3.1 避けるべき質問内容
ある程度プログラミングに慣れてきたら以下のような質問内容をできるだけ避けましょう．これらは暗黙にHowから聞いており，質問した相手の時間を上から順番に多く奪います．

以下に，それぞれの避けるべき質問の前にやるべきことをまとめました．
- どうやって動かせばいいですか？
    - README, ドキュメント, gitのissue, slackの履歴検索をよく見る
- （何の証拠も示さず）ソースコードを実行したのですが上手く動きません
    - 状況証拠が足りない 
    - "Why,When,  Where, What"が考慮されていない
- 上手く動きません．エラー文や，outputはこんな感じです．
    - エラー文をちゃんと読む
    - "Why,When, Where, What"が考慮されていない
   

## 3.2 自分と質問した相手の時間がどれだけ消費されてしまうかを考える
他人へ質問する際は以下を心がける
- とあるパッケージの使い方で不詳細な部分がある場合
    - 最初から知っておいた方がいいことがいくつかあるはずです．それを知らずに先に進めない場合は自分の時間を大量に無駄にしてしまいます．また，他人から見たら全く進捗がないように見えてイライラされます．
    - このような場合は初めに他人に使い方をレクチャーしてもらったほうが，**自分+他人**の時間は寧ろ最小限に済むでしょう．
- ビルドや実行時のエラーを解決したい場合
    -  背景 + 状況証拠 + "Why, When, Where, What"+ 調べたこと + 試したことやOutput を示したうえで"How"を聞く
    -  自分が見落としている状況証拠はないか？，もしくは直接Whyの答えを相手に考えてもらう．
    - 同じエラー・問題で数時間以上悩む場合は**一旦あきらめて寝て，翌日取り組む方が短時間で解決できる**場合いが多いです．上手くいけば，**悩んで無駄に徹夜する時間＋無駄な体力の消費**を無くすことができます．魔法のようですが，嘘だと思ったら何回か試してみてください．
    - 進捗がない日が続くのに，全く相談してこない場合も進捗共有相手に無駄な気を遣わせます．なぜなら，相手にとっては"今どのような状況にあるのか"をいちいち気にしないといけなくなるからです．この場合は定期的な報連相を心がけたほうが良いと思います．


# 4. おわりに
初めてソースコードを書くとき/動かすときは，"How"(どうやって書けばいいのか/動かしたらよいのか？)と検索したり，人に聞くでしょう．

しかし，問題を解決する場合には"How"から考えてはだめです．"Why"(なぜその問題が起きたのか)を明らかにしていかないと，具体的に"How"どうやってソースコードを修正したら良いのかを的確に知ることができません．

問題を解決する以外にも，出力された結果に対して"Why"を考える癖をつけると，自分で物事を考える力が鍛えられると思うので，普段からなぜか？と問うことを心がけてください．