Go Wiki: 質問方法
簡単な紹介
「Old street」から「New street」への行き方を知りたいとします。ランダムな人に助けを求めて、「Old street 19からNew street 3に行くための最速の方法は何ですか?」と尋ねます。そのランダムな人はあなたを助けることができるでしょうか?
世界には多くの「New」と「Old」の通りがあるので、まずあなたのいる国と都市を知る必要があります。通りのレイアウトが複雑な場合は、近くにある建物の名前を挙げる必要があるかもしれません。もちろん、スピードが問題なので、移動手段も重要です。徒歩、自転車、車、トラックのどれですか?トラックでは行けない場所に徒歩で行くことができます。
「Xをどうすればいいですか?」という直接的な質問に関するこれらの質問は、問題のコンテキストであり、他の人が問題を理解するのに役立ちます。コンテキストなしでアドバイスをすることは、他の人が間違った都市を説明することを意味する可能性があります。
直接会って質問するのは簡単で、立て続けに行うことができますが、フォーラムでは、回避できる多くのやり取りが発生します。では、問題のコンテキストを適切に伝えるにはどうすればよいでしょうか?
良い質問をする方法
フォーラムの人々は利用できる時間が限られています。そこで、物事を迅速化するために、より良い回答とより迅速な回答を得るための質問をするための小さなテンプレートを次に示します。
あなたが抱えている問題の要点。
どのようにして問題に遭遇しましたか?
何を達成しようとしていますか?
問題のコンテキストは何ですか?
ソリューションの要件は何ですか?
コンテキスト固有の制約/プロパティは何ですか?
play.golang.orgでのコンパイル可能で実行可能な例
状況に関するその他の注意事項(本番/学校/遊び/学習)
留意すべき点
- 時間をかけてスペルチェックを行い、文章が読みやすいことを確認してください。
- 解決策は、直接的な問題から遠く離れている可能性があります。したがって、質問には5回のなぜへの回答が含まれていることを確認してください。テンプレートにはすでに3つのなぜへの回答が暗黙的に含まれています。
- 質問のコンテキストは重要なので、常にコンテキストを提供してください。コンテキストを提供しないと、異なるコンテキストに適した回答が得られるため、最終的にあなたを傷つける可能性があります。コンテキストは、エンドユーザーまたはドメインの問題と目標、およびそれを解決しようとする方法に関する情報です。
- 抽象的な質問をしないようにしてください。もしそうするなら、複数の具体的な例を追加してください。具体的な例のない抽象的な質問は、(通常)時間の無駄です。それらは時には興味深い場合もありますが、具体的な例は議論を正確にすることができます。
- 「大量のデータ」や「高速に動作する必要がある」などの曖昧な用語は避けてください。「最大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
)に格納するだけで済みます。また、メモリが問題になり始めた場合は、ランレングスエンコードされたセットにすることもできます…
これで、さまざまなセットタイプの(不)利点について、より有意義な議論をすることができます。
この長い例の後、より多くの情報を提供することがなぜ役立つのかを理解していただければ幸いです。最初のやり取りによる質問は回避できたはずです。適切な質問は、質問者と回答者の時間を節約できたはずです。
最初の質問は次のようになります。
MapIndex
を使用してreflectのSet
メソッドをどのように使用すればよいですか?
セットパッケージのジェネリックマップに値を設定しようとしています。しかし、そうしようとするとパニックが発生します。play.golang.org/p/fCxBlL9V4Y
セットパッケージは、複数のシーケンスを調べて、シーケンス内のすべての共通要素を見つけるプログラムで使用します。シーケンス要素は、ヌクレオチドまたはタンパク質である可能性があります。プログラムは、最大1GBのデータサイズを処理できる必要があります。
現在のコードはgithub.com/...で入手できます。
これは生物情報学コースのために作成しているので、自分で実装する必要があります。
まとめ
- 最適な回答はコンテキストによって異なります。場合によっては、research.swtch.com/sparseの方が適切かもしれません。速度が重要でない場合は、
map
を使用すれば十分です。したがって、要件も重要です。
- 問題は別の場所にある可能性があります。ご覧のとおり、回答者はプログラムの構造に欠陥があるとは予想していませんでした。
map
を使用した構造体NucleotideIndex
を使用するということは、リフレクションを使用して複雑なものを作成する必要があることを意味しました。多くの場合、より高いレベルの問題を解決すると、他のすべてがはるかに簡単になります。
- 制約/プロパティは重要です。「セット要素は増加順に使用される」というプロパティは、本格的な
set
実装を必要としない簡単な方法があることを意味しました。この特殊な構造は、はるかに高速になる可能性があります。システム、コンテキスト、またはドメインに関する情報は、問題をはるかに単純にする可能性があります。
- 解決策は、通常のやり方とは異なる場合があります。おそらく質問者はJavaのジェネリクスに慣れていたため、
reflect
パッケージを使用することに決めたのでしょう。Goは異なる言語であるため、最終的な解決策はJavaでの解決策とは大きく異なる可能性があります。
その他のヒント
このコンテンツは、Go Wikiの一部です。