質問のコツ

質問のコツを知っておく意味は?

質問のコツを知っておくと、質問するときだけでなく、何かを学ぶすべてのときに役立つからです。

質問する力があれば、自分自身が何を理解していて、何を理解できていないかを明確にできます。 理解できていない範囲が明確になるので、 自分にとってよりためになる情報を引き出せる ようになります。 たとえ誰かに質問をできない場合でも、 自分自身で疑問を明確にすると問題の解決が簡単 になります。

「なぜ質問する側が気を遣わないといけないの?」 と感じられるかもしれませんが、そうではありません。 ぜひ良い質問をすることで、効果的にプログラミングやPythonを学習しませんか?というご提案です。

質問することを通して、理解の範囲を明確にする力、疑問を伝える力を磨いてください。 必ずプログラミング、Pythonの学習に役立つでしょう。

質問のコツ1. 知りたいことを明確に

質問の中で一番知りたいことは何でしょうか? 疑問を書き出してみた後、その言葉を掘り下げて、より明確な表現にできるか考えてみましょう。

まずは、自分の知っている範囲を書き出すことをオススメします。 「どこまでは分かるけど、ここが分からない」と質問することで、自分の知りたいことに注力した回答が得られます。

改善前

```python
if k in d:
    d[k] += 1
else:
    d[k] = 0
```
の意味がわかりません。

改善後の良い例

```python
if k in d:
    d[k] += 1
else:
    d[k] = 1
```
の意味が分かりません。

d 辞書が集計している結果なのは分かります。
k 変数が、集計の対象("コーラ" のような文字列)なのも分かります。

`if k in d` とすると、どういう場合に if ~ の処理で、
どういう場合に else ~ の処理になるのかが分かりません。

質問のコツ2. 試したこと、試していないことを伝える

自分がすでに試していることを書きましょう。 すでに試して分かっていることを明確に伝えることで、自分がどこで迷っているのか、疑問を持っているのかを伝えられます。

プログラムが動かないときや試行錯誤したときには、その試してみたことを質問で伝えると良いでしょう。

また「試したこと、試していないこと」を考える中で、自分で試せそうなことがあれば確認しておきましょう。 自分で解決して学んだことは忘れにくいので、永遠の財産となります。

改善前

うまくできているのに判定が通りません

改善後の良い例

3問目でプログラムを実行したところ、期待した実行結果のとおりに表示されます。

```
Hello World
```

ですが、「判定」をするとAssertionError: list differ... とでます。

* print(row) という処理を main() 関数内の for 文に入れて実行、 row 変数を確認して問題ありませんでした
* 売上CSVファイルの読み込み結果 data 変数を print(data) として確認しましたが、問題ありませんでした

AssertionErrorが意味しているプログラムの間違いを教えてください。

質問のコツ3. 何を期待していたかを伝える

何か期待していた動作と違っていたり、判定が通らなかったり、疑問が湧いたりしたので質問すると思います。 質問を書くときに、その疑問や経緯、期待していたことを伝えると良いでしょう。

改善前

このプログラムがなぜか動きません

改善後の良い例

プログラムを「実行」すると「期待した実行結果」のように売上の集計結果が表示されるつもりでしたが、
何も表示されないままになってしまいます。
main() 関数にはprint関数も書いているのですが、なぜ結果が表示されないのでしょうか。

質問のコツ4. プログラム、実行結果、エラー内容を伝える

プログラムがエラーになるときや、疑問なプログラムがある場合は質問内にプログラムを含めると良いでしょう。

以下のように書くことで、質問文中にプログラムを含められます。

```python
def main():
    print("Hello Wold")
    
if __name__ == "__main__":
```

クエスト中から質問した場合は、PyQのシステムが自動でプログラムや実行結果が質問内に含まれます。 ですが、より細かな点を指定するためにも質問文内にもプログラムを含むと質問の意図が伝わりやすいです。

改善前

ifで判定しているプログラムが動きません

改善後の良い例

main() 関数内で数値の大小を判定している if 文でエラーが起こります。

```python
if num < 5:
```

エラーは `TypeError '<' not supported between instances of str and int` となります。

質問のコツ5. Yes/Noで答えられる形式で聞く

質問するときに、疑問が明確であれば Yes か No で答えられる質問にしましょう。 もし「Yes」「No」だけの回答だけでなく深い意図や理由も知りたい場合は、併せて伝えると良いでしょう。

改善前

print関数で表示すると勝手に改行するのは何なんでしょうか

改善後の良い例

print関数で表示すると勝手に改行されるのはPythonの仕様ですか?
また、この挙動を変えることはできますか?

質問のコツ6. 名前を使う

「辞書」や「リスト」、「タプル」といったPythonの名前を積極的に使いましょう。 関数名を伝えるときも「range()」のような明確な名前を使いましょう。

「タプル」のつもりで質問文に「() の挙動を教えてください」と書いても、回答者にはタプルなのか、 関数のカッコ(range()) なのか、計算式のカッコ((1 + 3) * 5)なのか見分けがつきません。

また、指示語を避けて明確な名前を使うと良いでしょう

  • 「エラー」、「よくわからないエラー」 = 「ValueError」、「SyntaxError
  • 「関数の結果」 = 「agg_log() 関数の結果 data 辞書」

改善前

{} のキーがリストでない値なのはなぜですか?

改善後の良い例

辞書のキーを `.keys()` で取得した結果、 `dict_keys()` という値が返ってきました。
リストが返ってくる想定でしたが、 `dict_keys()` はリストではないものですか?

例:

```python
d = {"a": "A", "b": "B"}
print(d.keys())  # dict_keys(['a', 'b']) になる
```

質問のコツ7. 質問を分割する

複数の違う内容の質問の場合は、1つの質問の中で複数聞くのでなく、別々の質問を作成しましょう。

質問や回答が長くなると読み難くなりますし、後日、回答を振り返るときにも探しにくくなってしまいます。

改善前

この calc_sales 関数の集計処理で、なぜ ret = [] と事前にリストを設定するのですか?
関連して、リストの append はなぜ何の値も返さないのですか?
その場合は結合したリストを作る(既存のリストに追加でなく)方法はありますか?

改善後の良い例

質問1つ目

この calc_sales 関数の集計処理で、なぜ `ret = []` と事前にリストを設定するのですか?

質問2つ目

* リストの `.append()` が何の値も返さないのはPythonの仕様によるものですか?
* 結合したリストを作る(既存のリストに追加でなく)方法はありますか?

質問のコツ8. コミュニケーションの気持ちで

質問と回答という関係も一つのコミュニケーションです。

質問する人も回答する人も常に完璧ではありませんので、認識が違うことや間違えることもあります。 そういったときは素直に伝えあうことをオススメします。

  • 理解できた場合は「理解できました」と伝えると良いでしょう
  • 納得出来ない場合は「〜の部分が理解できませんでした、〜ということでしょうか?」のように聞き返すことをオススメします

例えば質問やコメントの入力欄に、以下のように > 文章 と書くことで文章の引用ができます。

> 〜の部分で〜使って書くと集計の処理ができると思います。

考えてみましたが〜を使うというのが理解できませんでした。
集計で以下のようにループを書くということですか?
...

質問のコツを知っておくと、より多くの情報を学べるようになりますし、自分自身の問題解決にも役立ちます。 ぜひ、質問と回答を通して質問する力や回答する力を磨いてください。