Go Wiki: 質問の仕方
簡単な紹介
「オールドストリート」から「ニュー ストリート」への行き方を知りたいと想像してください。助けを得るために見知らぬ人に電話をかけ、「オールドストリート19からニュー ストリート3まで最も速く行くにはどうすればよいですか?」と尋ねたとします。見知らぬ人はあなたを助けることができるでしょうか?
世界にはたくさんの「ニュー」と「オールド」のストリートがあるので、まずあなたがどの国と都市にいるかを知る必要があります。通りが複雑な場合は、近くの建物の名前を挙げる必要があるかもしれません。もちろん、スピードが問題となるため、あなたの交通手段も重要です。徒歩、自転車、車、トラックのどれですか?トラックでは行けない場所にも徒歩で行くことができます。
「Xするにはどうすればよいですか?」という直接的な質問を取り巻くこれらの質問は、問題のコンテキストであり、他の人が問題を理解するのに役立ちます。コンテキストなしでアドバイスをすると、相手が間違った都市について説明することになる可能性があります。
対面ではこれらの質問は簡単に、そして素早く連続して行うことができますが、フォーラムでは多くのやり取りの質問が生じ、それを避けることができます。では、問題に適切なコンテキストを与えるにはどうすればよいでしょうか?
良い質問の仕方
フォーラムの参加者には限られた時間しかありません。そこで、物事をスピードアップするために、より良い、より迅速な回答を得られる質問をするための小さなテンプレートを紹介します。
抱えている問題の核心。
どのようにして問題に遭遇しましたか?
何を達成しようとしていますか?
問題のコンテキストは何ですか?
解決策の要件は何ですか?
コンテキスト固有の制約/プロパティは何ですか?
play.golang.org上のコンパイル可能で実行可能な例
状況に関するその他の注意事項 (本番環境/学校/遊び/学習)
留意すべき事項
- スペルチェックに時間をかけ、文章が読みやすいことを確認してください。
- 解決策は直接的な問題から遠く離れている場合があります。したがって、質問には5つのWhyへの回答が含まれていることを確認してください。このテンプレートには、すでに3つのWhyへの回答が暗黙的に含まれています。
- 質問のコンテキストは重要なので、常に提供してください。コンテキストを提供しないと、異なるコンテキストに適した回答が得られる可能性があるため、あなたを傷つけることになりかねません。コンテキストとは、エンドユーザーまたはドメインの問題と目標であり、それをどのように解決しようとしているかの情報を含みます。
- 抽象的な質問をしないようにしてください。ただし、抽象的な質問をする場合は、複数の具体的な例を追加してください。具体的な例のない抽象的な質問は(通常)時間の無駄です。時には興味深いこともありますが、具体的な例は議論を正確にするのに役立ちます。
- 「大量のデータ」や「高速に動作する必要がある」などの不正確な用語は避けてください。「最大1GBのデータを処理する必要がある」や「100ms以内に1000の同時クライアントと通信する必要がある」など、測定可能なものを提供してください。
- Goでコンパイル可能な例を提示できない場合は、どんな言語でも構いません...多くの人は他の言語にも精通しています。コンパイルまたは実行できない場合でも問題ありません。
- 状況を説明するよう努めてください
- 「宿題である」と記すことで、人々はもう少し詳しく説明することができ、あなたの宿題を代わりにやってしまうことはありません。
- 「Xノードのクラスターで動作する必要がある」といった情報は、状況に応じたコンテキストを提供できます。コードが最終的にどこでどのように実行されなければならないかを示します。
- 「Xを学習するためのものである」と記すことで、異なるアプローチについてより深い理解を得ようとしていることが明確になります。
- 「NDA下にあるため、コードを開示できない」と記すことで、人々はコードを求めようとしません。しかし、それでも同様の状況を考案するように努めるべきです。これは回答者にとって役立ちます。
- 「宿題である」と記すことで、人々はもう少し詳しく説明することができ、あなたの宿題を代わりにやってしまうことはありません。
- 簡略化された例は読者にとって役立つ場合がありますが、完全なバージョンも提供することを忘れないでください。簡略化されたバージョンは完全なバージョンとは異なるため、解決策も異なる可能性があります。
もちろん、あまり心配しすぎないでください…すべての質問に答えることはできません。全体について4ページのエッセイを書く必要はありません。何か明確にする必要がある場合は、いつでも質問することができます。
悪い質問の物語
なぜそのテンプレートが必要なのでしょうか?回答者の立場になって、次のような質問を受けたとしましょう。
reflectのSetメソッドをどのように使用しますか?
質問者の視点からは、これは単純な問題に見えるかもしれません。もちろん、質問者が何をしようとしているのか、あなたには全く分かりません。彼は値、構造体、配列、またはマップに値を設定しようとしているのでしょうか?つまり、最初の質問をする必要があります: 例を挙げてもらえますか?
さて、質問者は例を挙げます
基本的にこれをやろうとしています
でもパニックになります。m := make(map[string]int)
v := reflect.ValueOf(m)
key := reflect.ValueOf("hello")
val := reflect.ValueOf(123)
v.MapIndex(k).Set(val)
print(m)
これで、コンパイルすらできないコードが得られました。これは、それをどこかにコピーペーストして間違いを修正する必要があることを意味します。play.golang.orgに置くと、問題がより簡単に見えるようになります(例:play.golang.org/p/fCxBlL9V4Y)。
修正は簡単です。代わりにSetMapIndexを使用するだけです。 もちろん、それが完全な話ではないかもしれません。質問者は別の問題を持って戻ってきます。
やった、リフレクションが動作しました。でも、十分速くありません。
どうすればもっと速くできますか?
「速い」とは何を意味するのでしょうか?彼は何をしようとしているのでしょうか?そこで、問題の詳細についてもっと尋ねる必要があります。そこであなたは尋ねます: 何を達成しようとしていますか?
ジェネリック型を格納できるセットパッケージを実装しようとしています。
なるほど、しかしそれでもなぜ速くする必要があるのかという答えにはなっていません。そもそも、mapを使えるのに、なぜreflectを使っているのでしょうか?そこであなたは答えます: 代わりにmap(例:map[type]struct{})を使うことはできませんか?何のためにsetパッケージを書いているのですか?
複数のシーケンスを調べて、共通の要素を見つけるプログラムを書いています。
主な用途はヌクレオチドで、大規模なデータセットで動作する必要があります。しかし、別の型で表現されるタンパク質でも動作する必要があります。
はい、map[NucleotideIndex]struct{}は少し良くなりましたが、まだ十分に速くありませんし、今度はタンパク質に対しても同じコードを書かなければなりません。
ついに必要な情報がすべて揃いました。解決策は簡単です。biogo https://code.google.com/p/biogo/ には、大規模なデータセットの処理や並列処理などに必要なほとんどの機能があります。また、「NucleotideIndex」とは何ですか? 質問者は答えを見つけて、ありがとうございます、とても良いです。と言うかもしれませんが、次のような可能性もあります。
おっと、それは良さそうですね、でも私はバイオインフォマティクスのコースにいて、そのコードを自分で書く必要があります。「NucleotideIndex」は「struct {Nucleotide Nucleotide; Index int}」です。
それは奇妙に見えますね、なぜそんなことをするのでしょうか。しかし、私たち全員が何か愚かなことをしたことがあるので...さて、あなたはより良いものを提案し始めることができます。おそらくmap[Type]map[int]struct{}を扱う方がはるかに簡単でしょう。シーケンスを扱っており、セットの要素は常に増加する順序で使用されるため、インデックスを配列に格納するだけで済みます。例えばmap[Type][]intのように。また、メモリが問題になり始めた場合は、それをランレングスエンコードされたセットにすることもできます…
これで、さまざまなセットタイプの(不)利点について、より有意義な議論ができます。
この長い例の後、なぜより多くの情報を提供することが役立つのか、おそらくご理解いただけたでしょう。最初の行き来する質問は避けることができました。適切な質問は、質問者と回答者の時間を節約できたはずです。
最初の質問は次のようになっていたはずです。
reflectのSetメソッドをMapIndexと組み合わせてどのように使用しますか?
セットパッケージ用の汎用マップに値を設定しようとしていますが、そうしようとするとパニックになります。play.golang.org/p/fCxBlL9V4Y
私は複数のシーケンスを処理し、シーケンス内のすべての共通要素を見つけるプログラムでセットパッケージを使用しています。シーケンス要素はヌクレオチドまたはタンパク質である可能性があります。プログラムは最大1GBのデータサイズを処理できる必要があります。
現在のコードはgithub.com/...で入手できます。
これはバイオインフォマティクスのコースのために書いているので、自分で実装する必要があります。
要約
- 最適な答えはコンテキストによって異なります。場合によってはresearch.swtch.com/sparseがより適切かもしれません。速度が重要でない場合は、
mapを使用するだけで十分です。したがって、要件も重要です。
- 問題は別のところにある可能性があります。ご覧の通り、回答者はプログラムの構造に問題があるとは予想していませんでした。
mapで構造体NucleotideIndexを使用することは、リフレクションで複雑なものを構築しなければならないことを意味しました。多くの場合、より高レベルの問題を解決すると、他のすべてがはるかに簡単になります。
- 制約/プロパティは重要です。「セット要素が昇順で使用される」というプロパティは、本格的な
set実装を必要としない単純な方法があることを意味しました。この特殊な構造ははるかに高速になる可能性があります。システム、コンテキスト、またはドメインに関する情報は、問題をはるかに単純にする可能性があります。
- 解決策は、あなたの通常のやり方とは異なるかもしれません。おそらく質問者は、Javaのジェネリクスに慣れていたため、
reflectパッケージを使用することにしたのでしょう。Goは異なる言語なので、最終的な解決策はJavaの解決策とは大きく異なるかもしれません。
その他のヒント
このコンテンツはGo Wikiの一部です。