teratailでの回答が1,000個に達したので振り返ってみる。


1.概要

  • プログラミングのQ&Aサイトとしてはstackoverflowが有名だが、国内発ではteratailというサイトがあって、こちらにちょくちょく回答してきて、回答数が先月半ばに1,000個に達したので振り返ってみた。

  • 私がteratailユーザーになったのは2014年の8月末で、翌月の9月3日に初回答した。それから今まで、わりと頻繁に回答した期間もあれば、お休み中のときもありつつ、1,000個目の回答は先月、2020年10月16日だった。

2.ベストアンサーの数と率

  • 仕組みとして、teratail では質問に回答が付いた場合に、質問者がベストアンサー(以下、BAと略)を選ぶことができる。いずれかの回答がBAとして選ばれるとその質問は解決済みになる。

  • teratail にはAPIがあり、自分の回答一覧などを取得できる。これを利用して登録から今までの回答数、そのうちのBA数、BA率を一覧にしてみた。※1

回答数 BA数 BA率
2014 3 0 0.0 %
2015 105 47 44.8 %
2016 28 14 50.0 %
2017 5 3 60.0 %
2018 289 184 63.7 %
2019 292 211 72.3 %
2020 278 178 64.0 %
合計 1,000 637 63.7 %

表1. 回答数、BA数、BA率の推移

  • 表1の見方としては、たとえば2015年中に回答した数は全105個で、そのうち47個をBAとしてお選びいただいた。
  • 表1にあるとおり、全体では1,000回答のうちBA数は637。また、2019年が回答数、BA数、BA率ともに最高だった。

3.回答する目的と回答時に気をつけた点

 teratail への回答は無償であるので、回答者として参加する動機は、人それぞれ様々であると思うが、自分としては以下のような目的を持って回答者として参加していた。

3.1 分かりやすい文章を書く訓練

 最近はどこの開発チームでもGitHubを使うことが多い。そこではissueだったりpull request だったりに様々なコメントを書くことになるので、分かりやすい文章を書く能力はかなり大事になってくる。分かりやすい日本語の文章を書くための指南書※2は多数出版されているが、それらを読んでインプットした知識のアウトプットの練習場の一つとして、teratail での回答を利用していた。誤読される可能性が少なて分かりやすく、かつ、問題解決につながる有意義な日本語を書くというのは簡単なことではない。それを敢えてまったく見ず知らずの人(である質問者さん)に向けてやってみるというのは、日本語の訓練として適度なストレッチがかかって、日本語練習の手ごろな訓練になった。
 この「分かりやすい日本語を書く訓練」を効果的なものにするため、「まったく見ず知らずの人(である質問者さん)に受け容れてもらえる文体と構成で書く」ことを意識していたが、そのために自分に課していたことがある。それは、質問者さんを仮想的に顧客企業の若い新人社員とみたて、私はその社員さんが新人プログラマーとしてアサインされたプロジェクトにその新人さんよりも前から参画している、中堅の外注プログラマーであるつもりで回答していた。なぜ、そのようなロールプレイングを想定したかというと、そのように想定することによって、目的とする「分かりやすい日本語」あるいは「受け容れてもらえる文体と構成」を書く訓練になりやすかったからだ。また、そのように想定することで、いわゆる「上から目線」と受け取られかねない文章を書かないようにする自己規制にもなった。

3.2 基礎を確認するためのコードを書く機会として利用する。

 業務でしかプログラミングをしていないと、どうしても、業務でアサインされているタスクを片づけるためのコードしか書かなくなり、特に基礎を確認するコードを書かなくなりがちなので、それを補う場としてteratailに回答者として参加していた。気をつけたことは、回答にコードを載せたら、それを可能な限り、オンラインのコード実行サイト(jsFiddle, CodePen, CodeSandbox, Repl.it など)に転記してそのURLも回答に記載し、質問者さんがすぐに実行して確認できるようにしたことだ。
 3.1 に書いたように、私は質問者さんを顧客企業の社員とみたて、自分はそのプロジェクトに以前からいる外注のプログラマーであるというロールプレイングを自分に課していたが、そうすると必然的に、私の回答は、顧客企業の社員に対する提案ということになり、提案全体の信用度を高めるために、載せたコードをすぐ実行して試せるように、CodePenだったりのコード実行サイトに回答コードを転記してそのURLを回答に追記しておくことを心がけた。コード実行サイトに回答コードを転記して間違いなく動くかを確認するのは、けっこう手間がかかるが、このひと手間を惜しむと、「基礎を確認するためコードを書く機会」にする目的達成が半減するように思われたので、回答を書くからには回答に載せたコードを動くところまで確認し、かつ「動くところまで確認している」ことが回答者さんに明確に伝わることを心がけた。逆にいうと、このひと手間をかけようがないような質問は回答を避けたように思う。

4.ランキング

 teratail で質問したり回答したり、また回答がBAに選ばれたりしていくと点数(スコア)がつく。また質問には、その質問がどのプログラミング言語による回答を求めているのかなどを示すタグを付加でき、タグ別の回答者ランキングも表示される。私が回答した質問に最も多く付加されたタグは JavaScript で、JavaScriptタグでのランキングは本稿を書いている2020年11月14日 11時の時点で10位となっていた。※3


(上記は2020年11月14日 11時ごろのスクリーンキャプチャ)

 振り返ってみると、先の 3. 回答する目的と回答時に気をつけた点に書いた目的を意識して teratail という場を使おうとはっきり意識しだしたのは、表1. 回答数、BA数、BA率の推移 でいうと2018年ごろからで、業務ではフロントエンジニア専業に軸足を移していった頃と重なる。そのためJavaScriptの質問に多く回答することになり、JavaScriptタグのランキングでベストテンの末席を汚させていただくこととなっていた。
 他のタグではどうだったのかを振り返るため、タグ別の回答数と回答率の一覧を回答の多い上位15位まで作ってみた。(なお、一つの質問に対して、複数のタグを付加することができる。)

タグ 回答数 全回答(1,000)
に占める割合
BA数 全BA(637)
に占める割合
BA率
1 JavaScript 504 50.40% 320 50.24% 63.49%
2 React.js 176 17.60% 154 24.18% 87.50%
3 jQuery 151 15.10% 105 16.48% 69.54%
4 HTML 94 9.40% 50 7.85% 53.19%
5 Python 91 9.10% 47 7.38% 51.65%
6 Python 3.x 66 6.60% 39 6.12% 59.09%
7 Ruby 55 5.50% 36 5.65% 65.45%
8 PHP 48 4.80% 17 2.67% 35.42%
9 Java 47 4.70% 30 4.71% 63.83%
10 HTML5 46 4.60% 34 5.34% 73.91%
11 Redux 45 4.50% 38 5.97% 84.44%
12 正規表現 43 4.30% 20 3.14% 46.51%
13 TypeScript 38 3.80% 30 4.71% 78.95%
14 配列 37 3.70% 22 3.45% 59.46%
15 Ruby on Rails 30 3.00% 19 2.98% 63.33%

表2. タグ別回答数などの一覧 ※1

 上記の表2.をみると、回答した質問がBAだった率が高いタグは、React.jsRedux で、その次が回答数は38で少ないながらも TypeScript だった。思い返せば、表1. 回答数、BA数、BA率の推移 で回答数が増えた2018年頃からは、Reactによるフロントエンド開発を専業にする機会が増え、今でこそ Redux を使わない選択肢が増えたが、当時はまだRedux一択だったので、業務を通じてReduxの知識が自然と増えた時期でもあった。TypeScriptについては、目下、参画しているプロジェクトでフロントエンドのReactと、Firebaseのfunctionを書くために毎日書いているが、業務に追われている間にも便利な書き方が増えていくので、日々キャッチアップに追われている。
 また、Python の回答もけっこうな数でやってたんだな、とか、正規表現の質問それなりに回答したけどBAだった率はそんなに高くなかったんだな、もう一度、オライリーの「詳説正規表現」を読み返そうかなとか、そういう気づきもあった。

5.記憶に残っている質問とその回答

 記憶に残っている質問とその回答とは、より詳しくいうと、その質問とそれに対する自分の回答を今でも覚えていて、「(回答に書いた、)ああいう解を思いつけるような思考の『引き出し』を、これからもキープし、願わくば向上させていきたい」と感じている質問のことで、それは以下のようなコードを問うものだった。※4

【問題】

 n を4桁の自然数とし、かつ n を構成する4つの数字はすべて異なり重複がないものとする。
このような n を引数として受け取り、下記の要件を満たす関数、check(n) のコードを書け。

   関数 check(n) は、
    n を構成する4つの数字の並びの中に、連続する数字3個が含まれていないならば、true を返す。
    n を構成する4つの数字の並びの中に、連続する数字3個が含まれているならば、false を返す。

 なお、上記の文中、「連続する数字3個」とは、たとえば、5,6,7 だったり、0,1,2 といった、1ずつ増え、
かつ、いずれも一桁の、3つの非負整数のことである。

 上記の題意に従って、ncheck(n)の例を示す。

  • n3459 のとき、上3桁の 3,4,5 は連続する数字3個であるので、check(n)false を返す。
  • n6012 のとき、下3桁の 0,1,2 は連続する数字3個であるので、check(n)false を返す。
  • n5612 のとき、連続する数字3個をどこにも含まないので、check(n)true を返す。

 この問題の解として、check(n) をプログラムとして書くときに、check(n) の引数 n の型は回答者が自由に決めてよい。すなわち、check(n)n として、 '1234' という文字列を受け取るものとして実装してもよいし、あるいは、1234 という整数値を受け取るものとして実装してもよい。また、teratail に投稿された質問では、もしかすると JavaScriptタグが付いており、質問者さんは JavaScriptによるコードを希望していたかもしれないが、本稿をお読みいただいている貴殿がこの問題をお考えいただく際には、プログラミング言語は何を使ってもかまわない。
 私がどのような回答を書いたかその具体的なコードを載せることは本稿の趣旨から外れるので割愛するが、check(n) の引数 n の型を整数として受け取り、かつ、check関数本体の中でも、n を文字列にすることなく結果のtrue または falseを得るコードを回答した。

6.課題

 本稿を書いていて、「これが今後の課題だな」という気づきが得られた。それは、上記から分かるように、

  記憶に残っている質問とその回答は、最もBA率の高かった質問ジャンルの中にはなかった。

ということである。最もBA率の高かったのは、先に挙げた 表2. タグ別回答数などの一覧 をみると、JavaScriptReact に関連する質問への回答なのであるが、上述の 5.記憶に残っている質問とその回答 に書いた、数字チェックの質問はこのカテゴリーには入らないし、私の回答はベストアンサーではなかったと思う。
 上記の「これが今後の課題だな」と思ったことを、より直感的な表現で分かりやすく言い換えてみると、「記憶に残っている質問とその回答」とは「(自分としては)最も会心の出来だった回答」とも言え、また「最もBA率の高かった質問ジャンル」は、「最も質問者さんのお役に立てた質問のジャンル」と言ってよいだろう。そうすると、

 (自分としては)最も会心の出来だった回答は、最も質問者さんのお役に立てた質問のジャンルの中にはなかった。

といえる。これが何を意味しているのか、ちゃんと考えたほうがいいような気がしていて、この「ちゃんと考えたほうがいい」課題を得られたことが、1,000回答して得られた最大の収穫かもしれない。たとえ自己満足に過ぎないとしても「最も会心の出来だった」と思える回答とは、「自分が大事にしたいことが表現されている回答」に他ならず、それが、最も質問者さんのお役に立てた質問のジャンルの中にあったのなら何の問題もなく、しっくりくる話なのであるが、自分の場合そうではなかったので、これは一考に値すると思ったのだった。

最後に

 1,000回答することで、先の 3.回答する目的と回答時に気をつけた点 に書いた目的のためにteratailを利用することは、それなりにやったという実感があることと、上記に書いた「ちゃんと考えたほうがいい」課題が得られたこととをもって、しばらくの間、teratail の回答から離れようと思う。いつかまた再び、何らかの目的でteratailでの回答を再開するかもしれない。それまでしばし休会しようという意図だ。

脚注

※1: 各表は、2020年11月1日に、teratail API から取得された内容をもとに算出している。

※2: 分かりやすい文章の書き方指南本の中で、自分のお勧めは本多勝一さんの「日本語の作文技術」です。

※3: とはいえ、ランキングは常に入れ替わるものだから、明日にはもうベストテンから外れているかもしれない。

※4: 本稿に記載した【問題】は記憶をもとに書いており、teratailに投稿された質問の原文ママ ではない

備考

  • この投稿に対するコメントへの回答は遅くなる、あるいはごく手短かな返答になる、もしくはコメントによっては返答しない可能性もあります。何卒ご了承ください。