静かなる名辞

pythonとプログラミングのこと

2019/03/22:TechAcademyがteratailの質問・回答を盗用していた件
2019/03/26:TechAcademy盗用事件 公式発表と深まる疑念


teratailでのプログラミング初心者の質問の仕方

はじめに

 teratailはプログラミングで生じた疑問を投稿すると、他のユーザーに回答してもらえる、便利でプログラミング初心者の方にとってはとても心強い味方になり得るサービスです。

 一方で、「使い方がわからない」「どんな質問をすればいいの?」「こんな内容で投稿していいのか不安」という人も多いと思います。また、中には「質問したけど回答がつかなかった」「質問に低評価がついて心が折れた」「コメント欄で文句を言われた」という人もいることでしょう。

 そこで、プログラミング初心者の方向けに「どんな風にteratailを使えばいいのか」を軽くまとめておきます。

 なお、少し自己紹介しておくと私は普段回答者としてteratailを利用しており、teratailのPythonタグで総合一位を持っています(2019年6月2日現在)。

証拠

私のプロフィールページ

 思わず回答したくなるような素晴らしい質問も、思わず回答したくなくなる駄目質問も数えきれないほど見てきたので、以下の内容もそれほど間違ったことは書いていないつもりです。回答する側の立場として、こうしてくれたら嬉しいな! ということを書きますので、ご一読いただければと思います。

 また、teratailの公式のヘルプページもできれば質問する前に読んでおいてください。

ヘルプ|teratail(テラテイル)

 特に、「質問するときのヒント」は必見です。質問する方全員がこれを読んでくれていたら、と思うときがたまにあります。

質問するときのヒント|teratail(テラテイル)

 この記事も、基本的にはこれらの記述に準拠した上で、回答者として日頃から思っていることを織り交ぜて書いています。ヘルプと重複する部分も多いので、時間のない人はこの記事を読まないで公式のヘルプだけ読んでいただくというのも一つの選択です。ただ、回答している人たちの考えていることを知りたいな、という人は、以下を読んでいただければスムーズなコミュニケーションにつながると思います。

どんなところなの?

 この記事を読んでいる人は、あまりteratailというサービスについて詳しくないと思うので、大まかな概要を先に説明します。

 が、この記事を読み進める前に、まずは

3分でわかるteratail|teratail(テラテイル)

 を一読してみてください。基本的な前提はこれで把握していただいて、補足的なことを中心にこの記事で書いていこうというつもりです。

 ……さて、読んでいただけたでしょうか。では、説明してまいります。

どれくらい流行ってるの?

 日本語圏のプログラミングQ&Aサービスでは、かなり活発に動いているところだと思います。一日に数百件程度は質問が投稿され、9割には回答がついています。

 他のQ&Aサービスとしてはスタック・オーバーフローもありますし、Qiitaで聞く、あるいはヤフー知恵袋や2ch,、Twitterで聞くという手もありますが、総合的な回答の得られやすさではteratailはかなり上位に位置するでしょう。

そもそも初心者が質問していいの?

 こういう疑問を持っている人も多いと思います。ページタイトルにも思いっきり「ITエンジニア特化型Q&Aサイト」って書いてありますし、現時点でITエンジニアではない人間が使って構わないのか? と思う人も多いですよね。

 確かに、運営がITエンジニア特化をうたっていることは事実です。ついでにいえば、少し前までは「思考するエンジニアのためのQAプラットフォーム」と銘打っていました。おそらく、本来目指していた方向性はそういうものだったのでしょう。

 しかし、だからといって非エンジニアはお断り状態なのかというと、それも違います。実際にプログラミングに不慣れとおぼしき方の質問も多いですし、そういった質問にも親切な回答がつくことが多いです。ついでに言えば、私も現役のエンジニアではなく、学生の身分のまま一年以上回答していますが、それが問題になったことはありません。

 割と敷居の低いサイトですし、初心者質問であっても丁寧なものであれば歓迎されている、というのが私の個人的な肌感覚です。なので、プログラミング初心者の方でも遠慮せずに使って良いと思います。

なんでも聞いていいの?

 プログラミングに直接関連することであれば、基本的には何を聞いても構いません。

 ただしある程度は制約があって、無条件でおすすめできるのは「エラーが出た」「思い通りに動かない」「こう書いてみたけど、あまりにも冗長なので書き換えたい。そのやり方がわからない」といったあたりまでです。要するに、コードを書いていて行き詰まったことを聞きましょう。

 「おすすめの書籍を教えてください」「プログラミングを勉強したいけど、おすすめのスクールは?」「エンジニアとしてのキャリアの積み方」みたいな質問はあまり推奨されていませんし、荒れる傾向にあります。

 自分の聞きたいことがそういったジャンルに該当するかも、と思う人は、投稿する前に下記のページを一読していただいた上で、投稿するかどうかを判断していただければ良いと思います。

推奨していない質問|teratail(テラテイル)

 また、最短距離で解決したい場合は、teratailで質問するより良い方法がある場合があります。たとえば、マイナーなライブラリを使っていてそのバグっぽい挙動に悩まされたら、teratailで聞くよりは、そのライブラリのgithubのページを探してissueを投げた方が良いです。開発に使っている製品のサポートセンターがある場合は、そちらに先に問い合わせましょう。一般的なteratailユーザにとって回答が難しい質問は、そういったところを案内されて終わるパターンもあります。

気軽に質問していいの?

 これについては、「気軽に」の程度が人によって大きく異なるので一概に言えません。

 ですが、できれば質問する前に自力で解決する努力をしてほしい、というのが全回答者ユーザの総意だと思います。で、いろいろ試行錯誤したこと、調べたことを質問文に具体的に書いてくれるのが理想的です。

 「タイプミスですね」とか「そのエラーで検索すると一番上にヒットする対処で解決しますね」みたいなのもたまにありますが、こういうのは時間の無駄ですし、虚しいです。

 それと、質問する人の中には、teratailで短時間で疑問が解決したのに味を占めて、毎日のように「ちょっと考えればわかるだろ、それ」という質問を出すようになる人もいます。これは当然ながら迷惑ですし、自身の成長にも繋がりません。節度を守って利用しましょう。

回答者はなんでわざわざ回答してるの?

 これ、謎ですよね。私もよくわかりません。2400件以上答えてるのに。

 もちろん人助けをしたいというのが基本的な動機でしょう。ボランティアです。また、回答する人も昔は初心者でいろいろな人に助けてもらった訳だし、インターネットの情報は今でも日々使っているでしょうから、恩返し的な意味で回答している、という側面もあるでしょう。

 また、teratailでは色々な技術的な話題が交わされます。回答者をやっていると勉強になるのは事実です。私がはじめた理由はこれでした。

 teratailで高い順位・スコアを誇っていれば転職などで活用できるという側面もありますが、これについてはあまり話が表に出てこないのでなんとも言えない面があります。でもまあ、そのためだけにやっている人というのもいないでしょう(自作のアプリケーションやWebサイトを作ったり、OSSで貢献した方が効率は良いでしょう)。

 あるいは、知識自慢とか、マウントの取り合いのつもりなのかもしれません。そういう人も中にはいると思います。いわゆる「教えたがり君」ですね。

https://ja.uncyclopedia.info/wiki/%E6%95%99%E3%81%88%E3%81%9F%E3%81%8C%E3%82%8A%E5%90%9B

 それか、単なる暇つぶしとか娯楽、と答える人もいるかもしれません。

 ……とまあ、いろいろな人がいると思います。(わざわざ節を立てて論じておいてなんですが)、いちいち考えるのは無駄ですので、気にしないほうが良いです。

 建前上は善意で回答しているということになっています。建前は尊重した方が安全なコミュニケーションが取れます。

使う上でのマナー

 さて、できれば「これくらいは守ってほしい」というマナーについて書いておきます。と言ってもそんなに押し付けがましいことを書くつもりはなく、質問者と回答者が快く、スムーズに問題を解決するための「マナー」です。

 一般的なネチケット、Q&Aサイトの利用方法は当然守ることを前提としています。その上で、特にteratail特有の事情について書いておきます。

 ここでいうマナーとは私が勝手に決めたものではなく、おおむね以下に準拠します。
質問するときのヒント|teratail(テラテイル)
推奨していない質問|teratail(テラテイル)

質問する前に自力で解決できないか頑張る

 基本的なことですが、質問する前にできるだけ自分で解決するように試みてほしいです。

 ここで言っているのは、

  • タイプミスしていないか確認する
  • 言語やライブラリの公式マニュアルを見て使い方が間違っていないか確認する
  • エラーメッセージが出たらそれで検索して、出てくるサイトを読む。英語のサイトが出てくるかもしれないが、google翻訳を使ってでも読む

 というレベルの内容です。また、可能な範囲でできるだけデバッグしてください。
(そういう努力の形跡が見られない質問が多すぎて、私が個人的に疲弊していることの裏返しでもあります。)

 実は、本当にどうしようもない質問だと5分くらいで解決したりすることもあるのですが、そういうのは質問者も回答者も互いに虚しいし、無益です。質問する人にとっては自力で解決するスキルが鍛えられませんし、回答する人はあまりにそういうのが多いと疲れます。

 行き詰まったら1時間は頑張ってみて、どうしても駄目なら10分くらいはかけて丁寧に質問を書く、というのが個人的にはいい塩梅だと思います。

最低限Markdownを使いこなす

 teratailはMarkdownに対応しています。Markdownという言葉を初めて聞いた人も多いと思いますが、これは「特定の書き方をすると、綺麗な見栄えに変換されて投稿される」という機能です。

 Markdownはとても多機能なので、完璧に使いこなす必要はありません。ただでさえプログラミングの勉強で忙しいのに、Markdownの使い方まで学ぶ暇はないという人もいるでしょう。

 ただし、teratailのシステムの仕様上、残念ながらMarkdownをまったく知らない人は「そもそもまともに質問できない」可能性が高いです。そういうシステムなので仕方ありません。

 以下に示す最低限のものは覚えて使ってください。数分で読み終えて理解できるはずですし、それで質問する側も回答する側も気分よく利用できるのですから、知っておいて損はありません。

コードはコードブロックの中に入れる

 回答者にとって、質問者に守ってほしいであろうマナーNo.1です。

 プログラムを直接質問に書くと、とても見づらい表示になってしまいます。

コードブロックを使わなかった例
コードブロックを使わなかった例

 インデントが潰れてしまうのと、# から始まるコメント行が見出しのMarkdownとして解釈されてしまうのが主な問題点です。他にも、Markdownとして解釈され得る記法があれば、そのまま表示されないことがよくあります(たとえばPythonの__init__などは斜体(イタリック)として解釈されます)。

 こういうコード部分はコードブロックを使ってください。

コードブロックを使った例
コードブロックを使った例

 コード部分の上下に```と書くだけです(キーボードが日本語配列なら半角モードでShift+@で入力できると思います)。なお、開始の```と終了の```は、基本的にはそれだけで一行になるようにしてください。余計な文字やスペースを入れるとうまく表示されないことがあります(後述の言語名は例外です)。

 手で打ち込むのが面倒くさい場合は、質問入力画面の<code>ボタンを押せば挿入できます。こちらでコードブロックを挿入してから間にペーストするか(繰り返しますが改行に注意)、先にコードを貼り付けてからコード部分を選択して<code>ボタンを押してください。

 なお、上側の```の右側には言語の名前を入力できます。<code>ボタンで挿入した場合は、「ここに言語を入力」というテキストがデフォルトで入っていると思います。これについては、そのままでも、単に消しても構いません。また、これを消して代わりにpythonとか、C、Javaといった言語名を書けばそれに応じてシンタックスハイライトが付きます。

 また、コードの他にも「エラーメッセージ」「CSVデータ」などもコードブロックの中に入れることをおすすめします。やはりそうしないと見づらくなるからです。

「文章中のコード」機能を使う

 こちらは上のコードブロックに比べると使う頻度が低いですが、``で囲むと行の中にコードを挿入できます。変数名や関数名などで使ってもいいでしょう。

 また、変数や関数などの名前がMarkdownとして解釈されてしまってうまく書けないというときは、この機能を使う必要があります。

「文章中のコード」機能の使用例
「文章中のコード」機能の使用例

見出しや水平線など

 これらは上のコードブロックと比べるとそれほど重要ではありませんが、必要に応じて活用してください。

見出しと水平線の例
見出しと水平線の例

Markdown総評

 とにかく、コードブロックだけは使ってくれ、というのが回答者の総意です。使われていない質問には修正依頼(後述)が飛ぶことも多いです。

 また、せっかくMarkdownを使っていても、残念ながら失敗してうまく表示されていない質問もたまに見かけます。そのあたりは、プレビューを見ながら調整しましょう。

 よりMarkdownについて詳しく知りたい場合は、

対応しているMarkdownの機能を知りたい | ヘルプ | teratail(テラテイル)

 を参照してください。

状況を再現できるだけの情報を示す

 質問文の状況が再現できない、という質問も多いです。

 回答する人は、何十行もある長いコードを先頭から読んで、頭の中で動作を追いかけている訳ではありません。とりあえず手元の環境でコードを実行し、エラーやバグに関係ありそうな箇所を中心に見ています。なので、エラーになった・思い通りにならなかった状況が再現できないコードはとても困ります。

 どういう点に注意するといいのかというと、だいたい以下の点です。

  • OS, 言語, 開発環境, ライブラリなどのバージョンは明記する

 これは最低限守ってほしいところです。だけど、これがなくても解決できる質問はあるし、逆にこれだけではぜんぜん情報が足りない質問もあります。ケースバイケースです。

  • コードは可能ならエラー原因箇所だけ抜き出して、そのままコピペすれば実行可能な状態で貼り付ける。難しければ、全体を示す

 状況を再現できるミニマムなコードを掲載するのが一番ですが、それが難しい場合は実行可能な状態にして貼ってください。エラーが出ている関数のコードだけ、といった方法で載せる方がよくいますが、検証が難しくなります。

  • 入出力のあるコードの場合は、それを載せる。入出力データが必要なら貼る

 CSVを読み込んで動かすコードなのに、入力のCSVが示されていないというのが、一番よくある困ったパターンです。また、CSVはテキストエディタで開き、コピペする形で「テキスト」として貼り付けてください(エクセルのスクリーンショットなどを載せる人もいますが、とても扱いづらいです)。ただし、著作権の都合や機密情報が含まれているなどで掲載が難しい場合は、同様の状況を再現できるダミーデータを示すようにします。また、データ量が多い場合などは外部のアップローダー等にアップしてリンクを貼る形で掲載します。

コード、エラーメッセージは省略せずに示す

 上の内容とも被りますが、コードやエラーメッセージを省略される方がよくいます。エラーが出た行だけ、エラーメッセージの最後の一行だけ、とか。

 コードは問題の本質を残した上でできるだけ短くしていただくのが理想的です。難しければ、実際に書いていて詰まったコードをそのまま載せても構いません。読むのが大変になりますが、省略されてエラー原因箇所がわからなくなるよりは助かります。

 また、エラーメッセージは必ず「全文」示してください。最後の一行だけ載せる人もよくいますが、検証が難しくなります。エラーメッセージにはエラー原因の詳細な情報が含まれているので、できれば全部見たいのです。

 なお、コードやエラーメッセージに、ユーザ名、APIのID&キーなど、公開したくない・してはいけない情報が載っている場合があります。そういった部分は、貼り付ける前に必要に応じて一括置換して頂いても構いません。

できるだけ情報を整理する

 情報を整理してください。読みづらい質問は回答もつきづらいです。

 と大雑把に書いてしまいましたが、こんなこと言われてもと思う方が大半でしょう。私もこう言われたら困惑すると思います。

 どんな情報が必要なのかはケースバイケースですが、

  • 必要なことが伝わって
  • 簡潔で
  • わかりやすくい

 質問は、そうではない質問より良いに決まっています。だから、文章構成とかにはそれなりに気を使ってください。回答する人もやっている作業ですから、同程度の労力は割いていただくのが妥当だと思います。

 コードをコピペするだけして30秒くらいで投稿したんだろうな、という質問もみかけますが、見ていて悲しくなります。どうせ投稿してから30分くらいは回答が来ない可能性の方が高いです。投稿を急ぐよりは、質問内容を充実させた方が良い結果を産みます。

 ものによっては、質問を整理している間にひらめいて問題が解決したりします。

質問タイトルに気を配る

 質問タイトルはできるだけ検索性を意識してつけましょう。ひどいのだと「Python エラー」みたいなタイトルで投稿している人が、実際にたくさんいます。タイトルを見て何の質問だかわからない、という質問を増やさないでください。

 どうしても良いタイトルが思いつかなかったら、エラーが出ている場合はエラーメッセージをタイトルにしてしまうというのが奥の手です。エラーメッセージがあれば問題を特定することはできるし、エラーで検索する人はたくさんいます。でも、これは積極的におすすめはしません。

質問した後の対応

 Q&Aサイトは質問して終わり、ではなく、当然ながら質問した後が本番です。予想もしなかったような回答がつくこともありますし、回答するには情報が足りないから追記してくれ、というリクエストが来ることもあります。

たまにはチェックする

 基本的に、回答などがつけば登録したメールアドレスに連絡が行くはずです。また、teratailのサイト上でも通知が出ます。

 半日おきくらいにはチェックするようにしてください。あまり長時間スルーされると回答者も気になります。

 たまに質問しっぱなしでその後一切の音沙汰がない人もいますが、なんのために質問したのだろうと思ってしまいます。もしかしたら自己解決しているのかもしれませんし、回答だけ見て「なるほど」と思って放置しているのかもしれませんが、自分で投稿した質問は自分の責任で適切な状態に保ってください。ベストアンサーにふさわしい回答がついて問題が解決したらベストアンサーに選ぶ、自己解決できたら自分で回答を付けて自己解決という扱いでクローズする。ということです。

追記・修正依頼がついたとき

 teratailには質問に対して追記・修正などを依頼する機能があります。ここについたコメントは回答ではありません。

追記・修正依頼欄
追記・修正依頼欄

 大抵は「これを試してみてくれ」「こういう情報がないと回答しづらいので、追記してくれ」といったコメントが付くと思います。そういった場合は、(新たに何かを実行する必要があれば実行して結果を確認したあとに)質問を編集して情報を追加してください。

 追記・修正依頼欄での返信で情報を追加される方もいますが、この欄はデフォルトでは折り畳まれていて、多くのユーザの目には触れません。あくまで質問の修正で対応するのがベストです。
(質問の修正だけでも通知を飛ばせますが、「質問文に追記しました」といったコメントをこちらに書いていただいても構いません。そうしなくても特に問題はありません。)

 また、teratailには評価という機能があり、あまりにひどい質問・回答には「低評価」がつきます。普通に使っていればそうそうお目にかかれないものですが、もしついてしまったら自分の投稿を省みて、直せる部分があれば直しましょう。たまに嫌がらせ的につくこともあるので、省みても悪い点が見当たらなければスルーしても大丈夫です。

解決したら質問をクローズする

 適切な回答がついて疑問・行き詰まりが解消したら、ベストアンサーを選んで質問を閉じてください。

 また、質問してから自己解決した、修正依頼欄のやり取りで解決してしまった、というケースもたまにあります。こういう場合は、自分で回答を付けてベストアンサーにし、自己解決としてクローズする機能がありますので、それを使ってください。自己解決にする場合は、問題を解決するための情報を自分でつける回答に含め、後から検索などでたどり着いた人が困惑しないようにします。

質問は自分ひとりのためにあるものではない

 ここまで読んできた人は、なんかこいつ面倒くさいこと言っているなーと思ったと思います。自分で読み返してみてもそう思っているので、正常です。

 「わからないことを聞きたいだけなのに、なんでこんな面倒くさいことをしないといけないの」と当然思われるはずですが、teratailはインターネット上のサービスです。あなたの投稿した質問が無事に解決すれば、将来において同じような問題を抱えている人の役に立つかもしれません。具体的に言うと、google検索で引っかかります。

 だから、後から見る人の役に立つようにしよう、という発想が大切です。要するに、質問というのはちょっとしたレポートみたいなものなのです。

 だけど、後から見る人まで意識した質問をする、ということができる人は実際問題として少ないし、そういう人はこの記事を読まなくても良いでしょう。初心者にはかなり高いハードルなので、そこまでの条件は万全に満たせていなくてもいいかな、と個人的には思っています(たまたま役立てば結果オーライ、程度)。

 最低限越えないといけないハードルは、teratailのコミュニティのメンバー全員にとって多少は有益な投稿である、ということだと思います。つまり、回答した人が最終的に「わざわざ回答してよかった」「自分の投稿が役に立ったみたいでよかった」と思えるような質問をする、というあたりです。互いに気分よく使える、というのは大切なことですから。

 そのために何が必要か? というと、けっきょくは常識的な丁寧さ、誠実さだと思います。陳腐な言葉で説教じみていて恐縮なのですが、そういうことが伝わるかどうかが「駄目質問」と「ちゃんとした質問」の分かれ目かな、と思います。

まとめ

 teratailで一年以上回答を続けた人間として、どんな質問が嬉しいのか、逆にどんな質問だと回答する気が失せるのか、ということを考えながら書いてみました。見直してみたら公式のヘルプをほぼなぞった内容になってしまった感もあり、少し落胆しています(というか、公式のが異常によく出来ている。ちゃんと読みましょう)。

 要約して言えば、

  • 質問する前に数十分程度は自分で頑張れ
  • 質問するなら再現性を確保しろ
  • 体裁を整えろ
  • 投稿したからには責任を持て

 という感じでしょうか。これらは、プログラミング初心者の方でも注意を払えば十分実行できる程度のことだと思います。もちろん、ちゃんとやろうとすると手間は増えるのですが、その手間のおかげでいい回答がつくこともある(ちゃんと丁寧に投稿している質問者には普通は好感が持たれる)ので、損にはならないと思います。ぜひ実行してください。

 最後に、もしかしたらこの記事を読んだ方とteratailでお会いすることがあるかもしれません。そのときは、よろしくおねがいします。