こんにちは、プログラマーのとだこうきです。
本記事では、プログラミングに関する質問の仕方を説明していきます。
プログラミングの勉強を始めた方で「動きません!」や「分かりません!」のような適当な質問をしませんか?もしそのような自分勝手な質問しているのであれば、それは「危険信号」です。
なぜならプログラミングの質問力は磨かないと学習効率が悪くなるからです。そして更に言うと、質問力が低い人は転職後にプログラマーとして上手く成長していない人が多いです。転職も上手くいかない可能性すらあります。
この記事を読むことで、プログラミングの質問の仕方を学ぶことができます。基本的なことから説明して、具体的な事例をもとにどう質問するべきかを紹介していきます。これさえ満たせれば上手に質問できる「質問テンプレート」も用意しています。
ちゃんと質問できずに損している方をエンジニアコミュニティで良く見かけるので、そうならないようにこの記事で学んでおきましょう。エンジニアとして忠告しますが、質問が下手なエンジニアは成功しないですよ。
結論を先に伝えておくと下のツイートの内容が良い質問をするためのポイントです。詳しくは以下で説明していきます。
良い質問とは低コストで最高の答えを引き出す質問
そもそも「良い質問とは何か」について先に説明しておきます。良い質問が何か分からなければ、それが「なぜ必要なのか」「どうやって質問すればいいのか」が分からないですからね。
端的に定義すれば、良い質問を「低コストで最高の答えを引き出す質問」です。わかりやすく言えば、回答者の負担に極力ならないけど自分が求めている情報を引き出すことができる質問ということです。
質問者の多くは自分のことしか考えていないように思えます。「分からない!」「なんで動かないのか!」と感情任せに質問しているように思えます。しかし、質問というのは相手があって初めて成り立つものです。相手に配慮するのは当然でしょう。
そして、「低コスト」というのは相手にとってもそうですが、自分にとってもです。相手にとっては答えやすいので回答時間は短くなります。回答時間が短くなれば、自分がすばやく答えを得られる可能性があります。お互いにとって相対的に良い状態を生み出すのが良い質問です。
なぜ質問力が重要なのか
では、「なぜ質問力が重要なのか」をより踏み込んで話していきます。
理由はシンプルです。
- 質問力を磨くことで問題解決能力が向上する
- 質問がちゃんとできないとエンジニアとして評価されない
質問力を磨くことで問題解決能力が向上する
実は、質問がちゃんとできるようになるとプログラマーとして問題解決能力が上がります。
なぜかと言うと、質問力を磨くことで「プログラマーらしい思考」ができるようになるからです。質問はプログラマーにわかりやすいように行う必要があるため、上手な質問をできる人はプログラマーらしく考えられているということです。
実際に、僕も他のプログラマーに質問するときに情報を整理していると答えが分かることがよくあります。これ実はプログラマーあるあるだったりもします。質問力は情報整理の能力と大きく関連しているので、質問力を磨く過程で問題解決能力が向上します。
質問がちゃんとできないとエンジニアとして評価されない
質問が出来ないとプログラマーとして評価されるのは難しいです。
なぜなら質問が下手なプログラマーはチームの生産性を下げるからです。質問が下手だと回答者の時間をいたずらに奪いますからね。
多くの初学者は質問する際に「〇〇したら動かなくなりました」と言うことが多いです。読者の多くにも心当たりがあるでしょう。しかし「動かなくなりました」というのは結果であり、原因を追求するのに十分な情報でありません。
質問が悪い場合、回答者は質問者に対して質問をしないといけません。「エラーは何か出ています?」とか「このサイトに同じような問題の解決方法が書いてありましたが確認しましたか?」とか。このコミュニケーションは無駄です。上手に質問できる人なら、最初に質問する段階でその情報を提供して相手の時間を奪わないように配慮できるからです。
プログラマーの生産性はできる人と出来ない人では10倍以上の差があると言われています。相手の時間を10分奪えば、100分以上に相当する時間を失っている可能性すらあります。質問相手は自分より生産性が高い優秀なエンジニアである可能性が高いのですから、チームのパフォーマンスを気にして質問できないと人材として評価されません。
プロを目指しているのあれば、プロらしくしましょう。
質問のテンプレートと質問例
良い質問が何か定義できたので、実際に悪い質問と良い質問を比較してみてみましょう。
悪い例と良い例
調べてみたのですが、全然わかりませんでした。
ユーザー登録の際にエラーが生じているようです。
原因となるコードは〇〇.rbと〇〇.rbと思われます。リンクを貼っておきます。その他のコードは development の branch で確認できます。
エラーメッセージが出ている◯行目が怪しいと思い調べました。
変数△の値が nil になっているのではないかと思いデバッグツールで確認したのですが、想定通り文字列の値が入っていました。
エラー文でググってみたところ、以下のようにstackoverflowには〇〇と書いておりました。
おそらくこの意味は〇〇だということだと思うのですが、今回の問題との関連性がいまいちわかりませんでした。
もし何かご存知であれば教えていただけないでしょうか?
良い質問と悪い質問の差は一目瞭然でしょう。
良い質問は、現状を可能な限り共有しており自分が検討した内容まで記載されています。回答者は質問に回答する際にこれらの情報を活用することができるでしょう。しかし、悪い質問をされた場合は手間ですね。良い質問に書いている内容を逐一質問して確認する必要がありそうです。回答するのが面倒だなという印象を受けます。
質問テンプレート
良い質問をするのは難しいですが、ある程度の型に則り行うことで悪くない質問ができます。
以下のテンプレートを使うことで基本的に悪い質問にはならないでしょう。
②起きている問題(起きている現象の詳細/エラーメッセージ/スクリーンショット)
③ソースコード(関連するソースコード/全ソースコード)
④問題解決するために試したこと(コードもあれば追記)
⑤問題について自分なりに考えたこと(デバッグ結果/検索結果/自分なりの原因予想)
なぜこういうテンプレートになるのか、それをどう活用すればいいのかは次章で詳しく話していきます。
最高の質問をするためのテンプレート活用法
では、テンプレートの活用方法を紹介していきます。質問が苦手な方でもこの5つの項目を埋めることで「良い質問」ができるようになります。
2. 起きている問題(起きている現象の詳細/エラーメッセージ/スクリーンショット)
3. ソースコード(関連するソースコード/全ソースコード)
4. 問題解決するために試したこと(コードもあれば追記)
5. 問題について自分なりに考えたこと(検索結果/自分なりの原因予想)
テンプレート活用法1. 聞きたいことの一行まとめ
質問するからには何らかの問題が発生しているはずです。それを端的に表現しましょう。そして、相手に何を求めているのか簡潔に書きましょう。
テンプレート活用法2. 起きている問題(起きている現象の詳細/エラーメッセージ/スクリーンショット)
ただ、完結すぎてもわからないので、補足が必要な場合はその続きで書きましょう。一度にいろいろな情報を与えられるよりも段階的に情報を与えられる方が人間は理解しやすいです。詳細を書く際のポイントは、現状をちゃんと理解してもらえる内容にすることです。
「エラーメッセージには△と出ております。この実装は□という機能を追加するために行っています。」
などのように現状を詳しく説明します。説明しておかないとどうせ聞かれます。なので事前にこちらから情報を提供しておくのです。問題によって質問の仕方は変わりますが、常に「相手の時間を奪わない」ように工夫することが重要です。コミュニケーションコストを下げて、相手が調べる時間を減るように工夫しましょう。
起きている問題をわかりやすく伝えるには以下を書くことをオススメします。
- エラーメッセージ
- スクリーンショット
喜ばれる情報1. エラーメッセージ
まずはエラーメッセージを書いておくべきです。
ほとんどの問題の答えはエラーメッセージに書いています。ゆえに問題が生じた際に「エラーメッセージが何か」はプログラマーがまず気にすることです。
※ HTML/CSS の場合はエラーが出ないので例外です。
なので、エラーメッセージが何かを共有しましょう。もし出ていなければ、それはそれで重要な情報なので、エラーメッセージが出ていなかった場合はその旨もしっかり伝えましょう。
「エラーメッセージの見方が分からない」という人は、エラーメッセージの見方から調べましょう!これは非常に大事です。調べて分からなければ、この記事に則りエラーメッセージの見方を質問してみてください。
喜ばれる情報2. スクリーンショット
場合によっては、スクリーンショットで状況を説明しましょう。
特に画面の説明する際に重要です。「見た目が崩れちゃったのですが、どうすればいいですか?」とテキストだけで質問されたら「えっなんのこと??」って思いますよね。「どういうふうに崩れているのか」分からないですからね。スクリーンショットを撮って共有しましょう。
動きのあるものを説明したいのであれば gif を使うのも有効です。コンピュータの画面から gif を作成する Kap を使うのがオススメです。
テンプレート活用法3. ソースコード(関連するソースコード/全ソースコード)
問題と関係するコードを共有しましょう。
原因調査をするほとんどの場合は実際のコードを読む必要があります。コードから問題が生じるのでコードさえ共有しておけばなんとかなる可能性が非常に高いです。
コードを共有する際も相手が見やすいようにしておきましょう。スクリーンショットでコードを共有する人が多いですが、正直オススメしません。なぜなら、見にくい上にコピペができないからです。回答者に配慮のない質問方法です。
コードをコピペする以外でソースコードを共有する方法は、以下の3つです
- GitHub にて共有
- Gist にて共有
Git に関する知識がある方は GitHub を用いてみてください。使い方は以下の記事を参考にしてください。
今さら聞けない!GitHubの使い方【超初心者向け】 – TechAcademy Magazine
気軽にソースコードを共有したい方は Gist というサービスを利用することもできます。
Gistでソースや文書をシェアする – Qiita
エラーメッセージから middleware.rb が原因ではないのかなと思っています。
https://github.com/mc-chinju/bitflyer-api/blob/master/lib/bitflyer_api/http/middleware.rb
念のためにその他のコードを共有
その他のコードは Github の master branch より確認いただけます。
https://github.com/mc-chinju/bitflyer-api/tree/master
テンプレート活用法4. 問題解決するために試したこと(コードもあれば追記)
問題解決のために試したことを共有しましょう!
これは何故重要かと言うと、共有しておかないと時間の無駄が発生する可能性が高いからです。
たとえば「〇〇という問題が起きました」と質問して「それなら△という原因じゃないかなと思いました」と回答があったとします。しかし、すでに質問者は調査済みだった場合、「△は調べたのですが、違いました」と返答しますね。これめっちゃ無駄ですね。返信時間も無駄ですが、回答者に「これはもしかしたら△かもしれない!!」と考えるに至るまでの時間を奪ってますね。非常に無駄です。
以下のようにデバッグツールなどを使って試したことを書くといいですよ。他にもコードを変更した場合にどういう変化があったのかなど書くとよいです。
ゆえに debugger を用いて person の値を確認したのですが、null ではなくて Person class のインスタンスでした。
テンプレート活用法5. 問題について自分なりに考えたこと(検索結果/自分なりの原因予想)
問題について自分なりに考えたことを書いておきましょう
これは何故重要かと言うと、考えたことを共有することで、自分が今抱えている問題を客観視できるからです。
考えたことを共有するには、情報を整理する必要があります。
「〇〇という理由だと思ったので△△を調べたのですが、□□という理由で違うと分かりました」というふうに論理的に説明する必要があります。これが重要です。論理的に説明していくことによって自分が抱えている問題を追求できます。△△が原因じゃないと断定できるので「実は●●か▲▲が原因なのではないか?」とか思いつきます。
具体的には、ググった結果や調査した情報から考えられる原因を書くなどがよいです。原因がさっぱり分からなときは「分からない」と書いておきましょう。思い当たる節が少しでもあるなら書いておきましょう。
インスタンスにメソッドがない場合にこのようなエラーが生じると stackoverflow に書いてありました。ですが、なぜこのメソッドがないのか理解できませんでした。
他の controller では利用できているメソッドなので不思議です。
質問力はプログラマーにとってのコミュ力
「未経験だからなんでも教えてもらえるだろう」という甘えは良くないです。ポテンシャルを見込まれているのは間違いないけど、そこに甘えて努力しない人材は評価されないからです。
プログラマーとして成長するためにも評価されるにもちゃんと質問できることは重要です。
そして、プログラマーにとっては質問力は重要なコミュニケーション能力です。「寸分たがわず正確に情報を伝達する」これがプログラマーにとっては常に意識するコミュニケーション手法だからです。そして、その一つが質問です。
すぐに身につけることは出来ない能力ですが、意識して何度も繰り返すことによって必ず成長させることができるのでテンプレートを使って鍛錬しましょう。
東京フリーランスでは東フリサロンというコミュニティを運営しています。ここではプログラミングに関する質問も受け付けています。コミュニティを上手く活用してプログラマーとして成長していきましょう
テンプレート
②起きている問題(起きている現象の詳細/エラーコード/スクリーンショット)
③ソースコード(関連するソースコード/全ソースコード)
④問題解決するために試したこと(コードもあれば追記)
⑤問題について自分なりに考えたこと(デバッグ結果/検索結果/自分なりの原因予想)