プログラマに「読解力」は必要か？

##01.はじめに
休みの日を使って新井紀子著の「ＡＩに負けない子どもを育てる」という本を読みました。
<img width="255" alt="IMG_0017.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473300/a3a52b31-5eeb-2051-a571-aef3983f8552.jpeg">
この本は、ベストセラーである「AI vs. 教科書の読めない子供たち」の続編として書かれた本で、本作では、主に「RST」と呼ばれる著者が開発した「読解力」を診断するためのテストについて書かれています。
RSTはそもそもはAIの性能を測るためのベンチマークとして開発され、人間には解けて、AIには解くのが難しいという問題で構成されています。
また、RSTに採用されている問題文は教科書や新聞から抜き出した文章であり、難易度もそこまで難しくないはず、、、なのですが、なぜか人間にも解くのが難しい(特に子供には)ようです。

本書にはRSTの体験版なるものが付いており、私も挑戦してみたのですが、53/70となんともいえない結果に終わってしまいました。(良い方ではあると思うが、ものすごく良い点数ではない)
とにかく、この本を読んで、「読解力」を身につけることの大切さを学んだので、今回はプログラマ視点から「読解力」は必要なのかというテーマについて書いていきたいと思います。

##02.プログラマに「読解力」は必要か？
私はプログラマに「読解力」は必要だと考えています。
はじめに「読解力」の定義について考え、次に具体例を交えてプログラマに「読解力」は必要な理由を考えていきたいと思います。

###読解力の定義は？
まず、「読解力」と聞くと、多くの人は国語のセンター試験で出てくる文章において、登場人物の心情や作者の考えを読み取る力だと考えます。もちろんそれも「読解力」の一つだと思います。しかし、本記事では先ほど紹介した本の内容を参考に「読解力」を以下のように定義します。

「事実について書かれた短い文章を正確に読む力」

例えば、次のような問題を皆さんは解くことができますか？

```
Alexは男性にも女性にも使われる名前で、女性の名Alexandraの愛称であるが、男性の名Alexanderの愛称でもある。

この文脈において、以下の文中の空欄にあてはまる最も適当なものを選択肢のうちから１つ選びなさい。
Alexandraの愛称は(   )である。
(出典:開隆堂出版(株)中学校英語教科書『Sunshine3』)

① Alex
② Alexander
③ 男性
④ 女性
```
この問題の正解は、もちろん①Alexですよね。
このような教科書や新聞に出てくる短い文章を正しく読む力を「読解力」と定義します。
(ちなみにこの問題の中学生の正答率は38%、高校生の正答率は65%だそうです。)

###「読解力」を構成する６つの要素
新井氏の本によると、読解力は以下の６つの要素で構成されているそうです。
①係り受け解析　文の基本構造を把握する力
②照応解決　代名詞などが指す内容を認識する力
③同義文判定　２つの文の意味する内容が同一かどうかを判定する力
④推論　基本的知識と常識から、論理的に判断する力
⑤イメージ同定　文と非言語情報(図式など)を正しく対応づける力
⑥具体例同定　定義を読んでそれと合致する具体例を認識する力

係り受け解析や照応解決、同義分判定は「読解力」の基礎となる部分であり、これらが正確に理解できていなければ、推論、イメージ同定、具体例同定といった能力はおそらく身につきません。
(ちなみに先ほど出題した「Alex問題」は係り受け解析の技能を測る問題です。)

###プログラマに必要な「読解力」-基礎-
では、プログラマはどのような場面で「読解力」を必要とするのでしょうか？
プログラマにおける教科書のようなものといえば、仕様書であったり、言語のリファレンスやチュートリアルであったりすると思います。
例えば、pythonのチュートリアルの中には次のような項目があります。
<img width="841" alt="スクリーンショット 2020-02-11 18.20.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473300/f9e40cb9-08a2-9fcf-3708-f9ed397eaebb.png">
(引用:<a href='https://docs.python.org/ja/3/tutorial/datastructures.html'>Python 3.8.1 ドキュメント>>チュートリアル>>リスト型についてもう少し</a>)

これはpythonのリスト型のsortメソッドについての説明です。
sortについては使う機会が多いため、どのような動作をするかを知っている人は多いと思います。
ですが、インプレース演算についての説明などをちゃんと理解することはできていますか？
元のデータ、演算結果などは何を指しているのか、どのような関係にあるのかなどを正確に理解することはできますか？
短い文章であっても書かれていることを正確に理解しなければ、エラーが発生した時などに困る可能性があります。
また、今は馴染みのあるメソッドについての説明でしたが、新しく学ぶ言語のチュートリアルを読む場合はどうでしょうか？
「RST」で測っている基礎的な「読解力」がプログラマとして活きてくるのは、はまさにこのような場面だと思います。

###プログラマに必要な「読解力」-応用-
競技プログラミングの問題を使って、プログラマに必要な応用的な「読解力」の応用的な内容を紹介したいと思います。
<img width="1020" alt="スクリーンショット 2020-02-11 11.38.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473300/9e923763-53b1-9997-1f0d-5c2773d7c6a1.png">
上はABC134で出題された問題です。
私はAtCoderを始めた頃にこの問題を解いたのですが、問題の意味がすぐに理解できずに苦労した覚えがあります。
また、コンテスト終了後にTwitterを見ても、私と同様にD問題の問題文の意味が理解できなかったという声が少なからずありました。そして、それはおそらく「読解力」が不足しているためだと思われます。
なぜならば、上で述べた読解力を構成する６つの要素が備わっていれば、問題文の意味を理解できるからです。
では、６つの要素がどのように問題文を理解するのに使われているのかを考えてみたいと思います。

問題文の２行目までを図にすると以下のような図を書くことができると思います。
![IMG_44CE0E119F95-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473300/12d23b82-99e6-491d-cdb5-e1b10b5f9f20.jpeg)
これは、N=5(空の箱の数)の時に、左から箱に1~5と整数を描き、それぞれの箱(整数1~5の箱)に対して、整数1,2,5の箱にはボールを１個入れ、整数3,4の箱に対しては何も入れなかった場合の図です。
この図を正確に描くためには、前節での①、②、⑤の技能が必要となります。
問題文を正確に読み、指示語が示している事柄を読み取り、それで得られた情報を図にする力が必要です。

次に、この問題ではいいボールの入れ方というものを定義しています。
「1以上N以下の任意の整数iについて,iの倍数が書かれた箱に入っているボールの個数の和を2で割った余りがaiである。」
定義全体の意味を理解する前に、定義の中に書かれている単語については理解できているでしょうか？
例えば、任意の整数iというのは、どのような整数を指しているのでしょうか？
「任意」という言葉を辞書で調べると以下のように書いてあります。

```
「任意」
②  〘数〙 特別な選び方をしないこと。あらゆる場合、すべての場合というのと同義にも用いる。 「 －な二点を結ぶ直線」 (引用　「三省堂 大辞林 第三版 」)
```
上にも書いてありますが「任意」が指す意味は「すべての場合」というのと同義であることがわかります。
そのため、先程示したいいボールの入れ方の定義を分かりやすくすると、以下のように書き換えることができます。

「1以上N以下のどの整数iおいても,iの倍数が書かれた箱に入っているボールの個数の和を2で割った余りがaiである。」
それでは、新しく得られたいいボールの入れ方の定義をもとに、先ほど図で示したボールの入れ方の例がいいボールの入れ方に該当するのか調べてみたいと思います。
![IMG_9EA58202DD54-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473300/e10e9956-f704-a8be-4610-710f3fa84a45.jpeg)
先ほど示したボールの入れ方はいいボールの入れ方ではないということがわかりました。
このように、前節の⑥のように定義を読んで、具体例を考える力も競技プログラミングを解く上で必要だとわかります。

では、この問題を解くためにはどのようにすれば良いのでしょうか？
倍数の性質を考えると、この問題の場合、１の倍数は2~5の倍数を含み、2の倍数は4の倍数を含むといった包含関係が成り立つことがわかります。
![IMG_42C91746EBB4-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473300/7e89043b-ba96-ddd9-a8ce-0e961ea6c84f.jpeg)
この場合、5の倍数の箱に入っているボールの和を先に確定させてしまえば、4以下の倍数の箱に入っているボールは5の倍数の箱に入っているボールの和に干渉することはありません。
そのため、大きい数が書かれた箱からボールを入れるかを決めていけば良いことが分かります。
この時用いるのは、④推論の力です。倍数の性質という基本的な知識を理解して、論理的に解法を導き出す能力が求められています。

このように競技プログラミングの問題を解く上でも、「読解力」を身につけることが必要であることが分かります。
今は、競技プログラミングの例を紹介しましたが、実際の業務においても課題を解決するためには、与えられた課題を理解し、イメージ化して基礎的な知識から推論するといった流れが必要になると考えられます。

##03.「読解力」を身につけるためには
それでは、「読解力」を身につけるためにはどのような勉強法が有効なのでしょうか？
本では、読解力が向上した例として、新井氏の教え子である菅原氏の経験が書かれていたので、その内容を軽く要約して、箇条書きでまとめてみます。

・読解力が低かったのは単語を眺めて適当に読み進めるといった誤った読み方が定着していたから。
・普段の生活の中で、ゆっくりでも正確に意味を理解しようと心がけることが大事。
・どんな文章を書けば相手に正確に伝わるのかを考える。

一つ目はいわゆる「AI読み」を止めるということです。
「AI読み」とは、新井氏が使っている言葉で、AIのように文章から単語だけを抜き出して(AI用語で「bag of words」)、それをもとに文章の内容を推測するという読み方のことを言います。
そのような読み方では、定型的なストーリーであれば読み進めることはできますが、新しい知識を得るための文章を正確に読むことは難しいです。

AI読みの代わりに行うべきなのは、文の作り(構文)を正しく理解することや、「と」、「に」、「のとき」、「ならば」、「だけ」などの機能語と呼ばれている語を正しく使えるようにすることです。
そのような読み方をすると、速く読むことはできなくなるかもしれません。しかしながら、読解力を向上させるために必要なのは読む速さではなく正確さであると、作中でも言及されています。

また、相手に伝わるような文章を書くことも「読解力」を身につける１つの方法であると思います。
相手の立場に立って文章を考えることで、否が応でも文章の構成を考える必要があります。
すると、人の書いた文章でも、その構成が見えてくるはずです。

１つ気をつけなければならないのはこれらのことを実践したとしてもすぐには読解力は向上しないということです。
菅原氏の場合はRSTの作問やレビューの仕事に携わって、半年くらい経ってようやく新井氏から読解力が身についたと書かれています。

##04.まとめ
本記事では、プログラマに「読解力」が必要であるという事柄について、「読解力」とは何かから、どのようにして「読解力」を身につけるのか、について書きました。
今回はプログラマ視点で書きましたが、読解力は生活のあらゆる場面で必要となってくるため、どんな人にとっても必須のスキルだと思います。
ですので、皆さんも本記事で興味を持ったら、一度本を手に取ってみたり、「RST」を受けてみたりして自分の読解力を確かめてみてください。

##参考文献
・<a href='https://www.amazon.co.jp/dp/B07WTLTZKX/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1'>AIに負けない子供を育てる</a>
・<a href='https://atcoder.jp/contests/abc134/tasks/abc134_d'>ABC134-D Preparing Boxes</a>
・<a href='https://mathtrain.jp/forallexists'>高校数学の美しい物語-全称記号（任意の〜）と存在記号（ある〜）</a>