ゼロから始めるプログラミングの学習日記

未経験の状態からプログラミング初めます

Off the Track:自然言語の学習と人工言語

自然言語(英語・西語)と人工言語

英語と西語の学習経験

英語は割と得意な方だ。
中学・高校とサマーコースに参加させてもらえたり、大学はサマーコースと1年間の交換留学を経験した。小学五年生の頃から英会話教室に通わせてもらい英語の学習には長い時間を割いてきた。
分かりやすい指標で言えば、TOEICのベストスコアは955点で、TOEFLは81点とかだった気がする。
TOEICは就活前(2019年頃)に、TOEFLは留学前(2015年頃)に受験した結果なので、今はまた変わっているかもしれない。
こういったテストの結果は、分かりやすい指標なので他人に伝える分には使いやすいが、英語の力を示すには物足りないようにも感じる。
逆に考えると、ここまでやってもこの程度のレベルなのか、と思う方もいるかもしれない。
まぁ、とにかくこれが自分の英語学習のフレームとレベルだ。

西語の学習については、アメリカ留学の1年の間に初級レベルのコースを1年間かけて受講した。
第二言語で第三言語を学んだ経験は、言語学習の本質を捉える上で重要な経験となっている。
特に、母国語を英語とする生徒が第二言語として西語を学習している環境と対比して西語を学ぶスピードは少しだけ早かったように感じる。
西語はそれ以降学習していないので、ほとんど覚えていないが、聞いてある程度理解できるレベルには留まっている。

自然言語の学習のコツ

自分は言語学を専攻していたわけでも、英米文や西語を専攻した訳ではないので"学術的に正しい学習方法"というのは全く検討もつかない。
ただ、これまで英語を勉強して、西語を学んだ時に感じたことを書いていく。
こうした言語(表音文字を使う言語)を学ぶためには

  1. 音の成り立ちを理解する
  2. 長文、例文の中からフレーズ・単語を集積する
  3. 語順の理解
  4. 文法(特定ルール)による変化の理解

を上から順に行う必要があると感じている。
表音文字(アルファベットなどそれ自体では意味を持たず音を示す文字)では"音"が重要になる。
表意文字(漢字など1文字がそれ自体で意味を持つ文字)を使用する日本語では、単語を1文字と捉えて集積しようとする癖があるように感じているが、表音文字の学習ではまず音の成り立ちを確認していくことが重要だ。
次に、フレーズ(特定の言い回し)や単語を集積していく。
この作業は、短文や長文を読み下す中で学習していくのが一番効率が良いように感じられる。
どういった文意やシチュエーションで使われる語句なのかを知ることができるためである。
語句を集積する中で、一定のルールに気付くことができるはずだ。
これが、語順であり文法による制限(過去や未来など文意による変化)である。

もちろん、人によっては、単語を単語帳などで集積していって長文に当たるのがうまい人もいるはずだし、文法を深く理解していくなかでその言語の真髄に触れることができるタイプの人間も居るだろう。
自分の場合は、表意文字話者として、表音文字言語を学んでいくためには、上の4ステップで学んでいくのが最も効率が良かった。

自然言語学習のステップを人工言語の学習に応用したい

自然言語の学習の段階を捉えることができたので、これをプログラミング言語などの人工言語の学習にも応用できないか考えてみることにする。

1. 音の成り立ちの理解について

音の成り立ちについては、言わずもがなプログラミング言語は発話することがないため、不要なように感じる。ただし、スクリプトライター(?)同士の会話上、齟齬があってはいけないため必要最低限の発音は身につけておくべきだろう。
i.e.) GIFがジフなのかギフなのか、widthはウィドスではなくてウィズだろうとか

2.フレーズ・単語の集積について

ここが最も重要だと感じられるステップだ。
言語を理解していこうとする過程で強く感じるのは「この時はこう」という形式がある程度固まっているということだ。
自然言語であれば、一つの事象を説明する場合、複数通りの言い方をすることができる。
i.e.) 行く、向かう、訪れる、参る…… / go, visit, trip, come ……

プログラミング言語でも数通りの書き方があり、それぞれの流儀に合わせて使い訳が存在するような気がしないでもないが、Java Scriptならループ文はこう、R言語ならこう、という形式が存在するだろう。
同じ結果を想定していたとしても言語や環境が異なれば、別の「言い方」になることもあるため注意が必要だ。
ただし、これは西語では同じ単語がチリとペルーでは別の意味を持つことがあったり、英語であっても米国と英国では言い回しが異なることに準じるので、学習上大きな違いであるようには感じない。
もちろん、この場合は、同じ単語であっても結果が違う点で、因果関係が逆転しているとも言えるし、ヒトの適応力によって文化背景を推察し「こう言いたいんだな」という推論が可能な点で異なる事象とも捉えることもできる。

ここで一貫して主張したいのは、QiitaやCodePenを見て実際に得られる効果を確認しながらスクリプトの例文や単語(指示文?)の使い方を肌で学んでいく必要があるということだ。
努力主義(?)の人によっては、まずは言語の特性や環境を深く理解して、何が出来るのかを学習した上でフルスクラッチでコードを書く必要性を説いている場合もあるだろうが、自分の場合はまずはコピペで「ここにこういうコードを仕込むんだな」という体験を集積して行くほうが学習上しっくりくる。

3.語順の理解および4.文法による変化の理解について

ステップ2で集積していったフレーズ、単語について、いつまでも検索→コピペで対応するのでは、その言語が身についていくとは考えられない。
時間をかければいずれ血となり肉となるのかもしれないが、自分の場合はそうではないだろう。
知識や言語は、そのルールや本質を理解してやっと身につくものだ。
集積した情報を分類分けしていき、よく使うものから「どういう時に使っているのか」「使う上で必要な指示は何か」という情報を抽出してく。
i.e.) Java Scriptでは、Math.randomで乱数を生成できるが、Math.floorで整数に丸めてやるということや、もっと簡単なことで言えば:や;の使い方()と{}の使い分けなどもこういったルールに含まれるだろう。
そして抽出した情報(傾向)を体系的にまとめてルールブックのようなものを作成する。
これは実際に記述してもいいし、習慣付けてもいいだろう。

所感:誰しもに当てはまるのかは不明

自然言語人工言語では、学習のスキームは共通していると感じている。
感じてはいるのだが、これで本当に自分の英語レベル(一般に高いとされる水準)までプログラミングのスキルが伸びて行くのかはわからない。
実際、自分の英語力が伸びた要因としては、10代からの課外学習と短期・一年を含む留学経験、および大学・大学院で積極的に日常会話をした経験から身についたものであることから考えると、スキルアップには非常に時間がかかることが伺える。
一方で、西語を英語で学んだ経験から言語学習のフレームを自分なりに理解できたし、西語の学習スピードは他に比べて早かったことから、このステップは自分に合っていることもある程度確認されている。
また、プログラミング言語が無秩序に構成されているわけではなく、英語ベースで開発されていることや(日本語に比べて)多くの情報が英語で集積されていることから「英語がある程度理解できる」という状態は、プログラミングの学習にポジティブな影響を与えるだろうと予想できる(ただし、この下駄を履いて速く走れるかはまた別の問題だ)。

もちろん「英語ができる」ことが「プログラミング言語の学習に圧倒的有利だ」と言える場合、多言語話者に比べ英語話者に高いプログラミングの適正があることになってしまうし、一概にそうとは言えないだろうという直感から言えば、プログラミング言語学習の適正に「英語力」は強い影響を及ぼすとは一概には言えない。
ただし、「第二言語を学習し自分なりにそのステップを噛み砕いた」という経験はポジティブには働くだろう、という希望的観測をしている。

非常に雑文、乱文、大阪人のいうところ「知らんけど」という一言で締めくくられるような文章になってしまったが、プログラミングの学習の初期ステップで感じていることについてまとめてみた。
これから自分の考えがどう変化して行くのか、自然言語の学習経験がプログラミングの学習に実際に与えた影響について、今後まとめることができたら自分にとって糧になるだろう。