良い質問をすることは、ソフトウェアを作る上で非常に重要なスキルです。私は長年の間にこのスキルを身につけてきました(同僚がよくコメントしているほどです)。私にとって効果的だったガイドラインをいくつかご紹介しましょう。

悪い質問をしても大丈夫

私は実際のところ、馬鹿げた質問や「良くない」質問をすることを大いに支持しています。私はいつも人に馬鹿げた質問をしています。Googleやコードベースを検索すれば答えられるような質問です。ほとんどの場合、そうしないようにしていますが、たまにはやってしまうこともあり、それが世界の終わりだとは思っていません。

ですから、この戦略リストは、「質問をする前にしなければならないことがすべてあり、そうでなければあなたは悪い人であり、嫌な気分になるはずだ」というものではなく、「私がより良い質問をし、欲しい答えを得るために役立ったことをいくつか紹介します!」というものです。

もし誰かが「良い」ことでないと質問に答えようとしないのであれば、私はその人に読んでもらうために別のブログ記事を書きました。[役に立つ質問の答え方】(https://jvns.ca/blog/answer-questions-well/)

what’s a good question?

私たちが目指すのは、技術的なコンセプトに関する質問で、答えやすいものです。私はよく、私が知りたい知識をたくさん持っている人と一緒にいることがありますが、その人はいつも、それをどうやって私に説明するのが一番いいのか、正確にはわからないのです。

一連の質問がうまくいけば、相手が自分の知識を効率よく説明し、私が知りたいことを教えてくれるようになります。では、その方法をご紹介しましょう。

あなたが知っていることを述べる

これは、私の大好きな質問のテクニックのひとつです。この種の質問は、基本的に次のような形をとります。

  1. これまでに理解していることを述べる
  2. “それでいいですか?”と聞く

例えば、最近、ある人(本当に優秀な質問者)とネットワークについて話していました。彼らは、「つまり、私が理解しているのは、再帰的なDNSサーバーのチェーンがあるということです。それは正しくありませんでした。実際には、再帰DNSサーバーの連鎖はありません。(再帰型DNSサーバーと話すとき、関係する再帰型サーバーは1つだけです)ですから、彼らがこれまでの理解を述べてくれたおかげで、実際にどのように機能するのかを明確にすることができました。

私は少し前にrktに興味を持っていたのですが、コンテナを実行する際に、なぜrktがDockerよりも多くのディスク容量を消費するのか理解できませんでした。

「コードがどのように動作するかは大体理解していましたが、なぜそのようにコードを書いたのかが分かりませんでした。そこで、rkt-devメーリングリストにこんな質問を書いてみました。Why does rkt store container images different from Docker?.

  • rktとDockerの両方がコンテナをディスクに保存する方法について、私の理解を書き留めました。
  • 彼らがそのように設計したのではないかと思う理由をいくつか考えてみました。
  • そして、”私の理解は正しいか?”と尋ねました。

返ってきた答えは非常に有益で、まさに私が求めていたものでした。納得のいく質問をするまでにかなりの時間を要しましたが、そのおかげで何が起こっているのかをより深く理解することができたので、時間をかけてよかったと思っています。

自分の理解を述べることは決して簡単ではありませんが(自分が何を知っているかを考え、考えを明確にするのに時間がかかります!)、これはとても効果的で、あなたが助けを求めている相手にとってもずっと楽になります。

Ask questions where the answer is a fact

私が受ける質問の多くは、「SQLの結合はどのように機能しますか」というような、漠然としたものから始まります。なぜなら、結合の仕組みにはたくさんの異なる部分があるからです。なぜなら、結合の仕組みにはさまざまな部分があるからです! 私が学びたいと思っていることを、その人はどうやって知ることができるのでしょうか?

私は、答えが簡単な事実であるような質問をしたいと思っています。例えば、SQLの結合の例では、答えが事実である質問は次のようになります。

  • サイズがNとMの2つのテーブルを結合するときの時間的な複雑さは何ですか?それはO(NM)ですか?O(NlogN) + O(MlogM)?
  • MySQL は結合を行う前の最初のステップとして、結合カラムを常にソートしますか?
  • Hadoopが「ハッシュ結合」を行うことがあるのは知っていますが、これは他のデータベースエンジンも使用する結合戦略ですか?
  • インデックス付きのカラムとインデックスなしのカラムの間でjoinを行う場合、インデックスなしのカラムをソートする必要がありますか?

このように超具体的な質問をすると、質問した人は必ずしも答えを知らないのですが(それはそれでいいのですが!)、少なくとも私が興味を持っている質問の種類を理解してくれています。

わからないことは積極的に言おう

誰かが何かを説明しているときに、私が理解できないことを言ってしまうことがよくあります。たとえば、データベースについて説明しているときに、「MySQLでは楽観的ロックを使っているから……」と言われたとします。私は「楽観的ロック」が何なのか、さっぱりわかりません。そんなときに聞いてみるのもいいかもしれませんね。:)

これはどういう意味ですか?」と誰かを止めることができるのは、とても重要なスキルです。自信のあるエンジニアの特性のひとつであり、成長するための素晴らしいものだと思っています。頻繁に説明を求める先輩エンジニアをよく見かけますが、自分のスキルに自信が持てるようになると、これが容易になるのだと思います。

実際、私が何かを説明しているときに説明を求めてこない人は、本当に聞いていないのではないかと心配になるほどです。

また、質問者が自分の知識の限界に達したときに、それを認めるスペースを作ることもできます。私が誰かに質問するときには、相手が知らないことを聞くことがよくあります。私が質問した人はたいてい、「いや、それは知らないよ!」と言うのがとても上手です。

理解できない用語の確認

今の仕事に就いたとき、私はデータチームに入りました。私の新しい仕事の内容を見始めると、これらの言葉が出てきました。Hadoop、Scalding、Hive、Impala、HDFS、zoolander、などなど。Hadoopという言葉は聞いたことがあったかもしれませんが、これらの言葉が基本的に何を意味するのかわかりませんでした。これらの言葉の中には、社内プロジェクトのものもあれば、オープンソースのプロジェクトのものもありました。そこで私はまず、それぞれの言葉の意味や関係性を理解するために、人に尋ねることから始めました。私が尋ねた質問のいくつかを紹介しましょう。

  • HDFSはデータベースですか?(いいえ、分散型ファイルシステムです。)
  • ScaldingはHadoopを使っていますか?(はい)
  • Hive は Scalding を使っていますか?(いいえ)

あまりにも多くの用語があったので、私は実際にすべての用語の「辞書」を書きました。そして、すべての用語の意味を理解することは、自分自身を方向付けるのに役立ち、後でより良い質問をすることができました。

Do some research

上記のSQLの質問を入力しているときに、Googleに「How are sql joins implemented」と入力しました。いくつかのリンクをクリックして、「ああ、なるほど、ソートがあったり、ハッシュ結合があったりするんだな、聞いたことがあるな」と思い、さらに具体的な質問を書いてみました。最初に少しググったおかげで、少し良い質問を書くことができました。

誰かとランチをしているときに、その人の仕事に興味を持って、基本的な質問をすることがあります。これはまったく問題ありません。

でも、調べ物をすることは本当に役に立つし、十分な調べ物をして素晴らしい質問を考え出すことができると、実際にとても楽しいものです。

誰に質問するかを決める

ここでは主に、同僚に質問することについて話しています。なぜなら、それは私がほとんどの時間を過ごす場所だからです。

同僚に質問をするとき、私はいくつかの計算をしています。

  • この人にとって今は良い時期なのか?(その人にとって今は良い時間なのか?(もし、その人がストレスの多い仕事の最中であれば、おそらくそうではないでしょう)。)
  • この質問をすることで、相手にかかる時間と同じだけ私の時間が節約できるか?(もし、相手が5分で答えられる質問をして、私が2時間も節約できるとしたら、それは素晴らしいことです:D)
  • 私の質問に答えるのに、彼らはどのくらいの時間がかかりますか?もし30分も質問があるなら、後で時間を確保したほうがいいかもしれませんが、もし1つだけ簡単な質問があるなら、今すぐにでも聞くことができるでしょう。
  • この質問をするには、この人は年上すぎるかな?あるトピックについて質問するとき、最も経験豊富で知識のある人に尋ねるという罠に陥りやすいと思います。多くの場合、その人はあなたの質問のほとんどに答えることができますし、負荷を分散し、自分の知識をアピールすることができます(これは素晴らしいことです)。

いつも正しいとは限りませんが、こういったことを考えるのは私にとって有益なことです。

また、私は通常、親しい人に質問することに時間をかけます。ほとんど毎日話す人がいますが、彼らは私が取り組んでいることについて多くの状況を知っていて、役立つ答えを簡単に教えてくれるので、私は彼らに簡単に質問することができます。

How to ask questions the smart way by ESRは人気のある、かなり敵対的な文書です(「私たちはこのような人たちを “負け犬 “と呼びます」というような記述で悪く始まり、あまり良くなりません)。また、インターネット上の見知らぬ人に質問をすることについても書かれています。インターネット上の見知らぬ人に質問することは、超便利なスキルであり、本当に有益な情報を得ることができますが、質問することの「ハードモード」でもあります。相手は自分の状況をほとんど知らないわけですから、それに比例して、自分が何を知りたいのかを丁寧に伝えることができます。How to ask questions the smart way」は、質問者に非常に理不尽な負担を強いていると思いますが(質問をする前に、欲しい情報を得るために他の可能な選択肢をすべて検討すべきであり、そうでなければ「怠惰なスポンジ」になってしまうと書かれています)、「How To Answer Questions in a Helpful Way」のセクションは良いと思います。

Ask questions to show what’s not obvious

質問のより高度な形として、隠された前提や知識を明らかにするために質問することがあります。この種の質問には、実際には2つの目的があります。まず、答えを得ること(ある人が持っていて、他の人が持っていない情報があるだろう!)だけでなく、隠れた情報があること、それを共有することが有用であることを指摘することです。

Etsy’s Debriefing Facilitation Guideの「The Art of Asking Questions」のセクションは、起こった事件について話し合うという文脈で、このことについて実に素晴らしい紹介をしています。そのガイドにある質問をいくつか紹介します。

“このような失敗が起こったと思われるとき、あなたはどのようなことを探しますか?”

“この状況が「正常」であるとどのように判断しましたか?”

データベースがダウンしていることをどうやって知りましたか?

それがページ作成に必要なチームだと、どうやってわかったのですか?

このような質問(基本的なことのように見えますが、実際には明らかではありません)は、ある程度の権限を持った立場の人が質問すると、特に威力を発揮します。私は、マネージャーやシニアエンジニアが「データベースがダウンしていることをどうやって知ったのですか」というような基本的かつ重要な質問をするのがとても好きです。

Answer questions.

André ArkoのHow to Contribute to Open Sourceの記事の中で、私が気に入っている部分の一つが、彼の言葉です。

すべてのイシューとプルリクエストを読んだ後は、自分が答えられる質問を探してみましょう。以前に回答されたことがある質問や、先ほど読んだドキュメントで回答されている質問をしている人がいることに気づくのに、それほど時間はかからないでしょう。答え方を知っている質問に答えましょう。

新しいプロジェクトに取り組んでいる場合、自分が学んだばかりのことを学んでいる人たちからの質問に答えることは、自分の知識を確かなものにするためのとても良い方法です。新しいトピックに関する質問に初めて答えるときは、いつも「mg、もし間違って答えたらどうしよう、mg」という気持ちになります。でも、たいていは相手の質問に正しく答えることができ、その結果、そのテーマをよりよく理解できたような素晴らしい気分になるんだ。

質問は大きな貢献となる

良い質問は、コミュニティに大きな貢献をもたらします。以前、ツイッターでCDNについてたくさんの質問をして、その答えをCDN aren’t just for cachingにまとめました。多くの人があのブログ記事を気に入ったと言ってくれましたし、私があのような質問をしたことで、私だけでなく多くの人が助けられたのだと思います。

質問に答えるのが好きな人はたくさんいますよね。ただ、「すごく迷惑をかけるのではなく、少しだけ迷惑をかけるように良い質問をする」のではなく、「良い質問は会話を盛り上げるためにできる素晴らしいこと」と考えることが大切だと思います。

質問をすることについて私が言いたいことがあると思い出させてくれたCharity Majorsと、このことについて一緒に話してくれたJeff FowlerとDan Puttickに感謝します。