Wednesday, 14 July, 2021 UTC


Summary

Ahoy! はじめまして、TwilioのDeveloper VoicesチームにDeveloper of Technical Contentとして入社した中嶋ステファニーみなみです。
突然ですが、あなたは第二言語を学んだことはありますか?多くの人は学校の必修科目として、あるいは純粋な興味から勉強したことがあるのではないでしょうか。私個人としては、オーストラリアと日本の2つの文化を持つ家庭で育ち、両国に住んだ経験から、言語を学ぶことの楽しさと難しさの両方を実感してきました。
二つの言語を話せるようになるまでは簡単な道のりではありません。 いざ話せるようになっても、それで終わりではありません。語学学習には様々な側面があり、生涯学習が欠かせません。 両方の言語のスキルを磨き続けること、文化の違いを理解して受け入れること、文化や伝統が大きく異なる中で自分のアイデンティティを形成することなど、直面するハードルは数えればきりがありません。
私自身も日本からオーストラリアに移住したころ、最初は完全に別の言語に浸る環境に圧倒されました。ですが、家族や友人、先生方からの温かいサポートのおかげで会話を楽しみ、人とのつながりを深め、最終的には失敗することへの恐れを克服し、新しい環境と言語に深い絆を築くことができるようになりました。
このようなチャレンジは様々な形で、そしてしばしば思いがけない形で報われることがあります。 私の場合は、プログラミングを学び始めたときに返ってきたと思っています。
プログラミングと言語学習が描く曲線
大学時代、JavaScriptの世界に没頭していた私は、プログラミングと言語学習に共通するあるパターンに気付き始めました。学習曲線がよく似ているのです。
まず、学び初めは、誰が何を言っているのかわからない状態です。自分が何が分からないのかも分からず、自分にはこの分野は合わないと思ってしまいがちです。聞いたことのない言葉や表現の多さに圧倒され、一定以上の会話にはついていけず、途方に暮れてしまいます。
しかし、続けていくうちにある瞬間から急激に学習スピードが早まります。細かい文法的なミスをしながらも、会話ができるようになります。
その後、 高原状態がやってきます。第二言語の世界は、当初想像していたよりもはるかに広いことを実感しますが、自信がついたことで、もっと新しい知識をつけたいと思う熱意がさらに成長を後押ししてくれます。
言語学習とプログラミングの根本的な違いはいくつも挙げることができますが、共通点を通してプログラミングを恐れなくても大丈夫な理由をここからご紹介したいと思います。
Learning-by-doingの強み
理論を学ぶことは非常に重要ですが、理論的な知識と実践的な経験を組み合わせることで、学びに拍車がかかります。言語学習の世界では、教科書を読むだけでは文法や典型的な使用例などの基本的な知識しか得られないことが多いのではないでしょうか。教科書の外の世界には、その言語を話す人との交流をして初めて触れることができる表現や言い回しが多くあります。これは、プログラミングも同じです。 オブジェクト指向プログラミングの専門書を一通り読んだとしても、いざコードに実装しようとすると戸惑ってしまうことがあります。 また、実際にコードを書いてみることで試してみなければ見つけられなかった新しい分野や興味を発掘することができます。
失敗は成長の糧になる
言語を学ぶときに直面する典型的なハードルは、失敗を犯すことへの恐れではないでしょうか。「他の人の会話を遅らせてしまうのではないか」といった気持ちは、言語学習者なら誰でも持つものです。 しかし、言語学習とプログラミングの両方において、失敗は必要であり、進歩の兆候でもあります。
ミスをするたびに、それまで気づかなかった、あるいは触れることのなかった部分に気づくことができます。 プログラミングにおいては、問題に直面するとデバッグをしたり、自分で調べたり、仲間に助けを求めたりします。自分の弱点を特定し、それを克服するための努力をする機会になります。早く失敗すればするほど、早く習得することができます。
あなたのクリエイティビティをプログラミングで生かす
第二言語を学び始めたばかりの頃は、正しい文法で文章を作ることだけで手一杯です。 しかし、対話の経験を重ねるうちに、第二言語でも自分の個性を出すことができるようになります。慣用的な口語表現や自分の口癖、さらには冗談を言ってみたりなど、様々な表現を使いこなすことができるようになってきます。 この考え方は、プログラミングの世界にも通じるものがあります。一例をご紹介します。
まずは、こちらのスニペットをご覧ください。
const str = ["a","h","o","y"] const reverseStr = function(str) { let left = 0 let right = str.length -1 while (left < right) { [str[left++], str[right--]] = [str[right], str[left]] } console.log(str) } reverseStr(str) 
次にこちらのスニペットをご覧ください。
const str = ["a","h","o","y"] const reverseStr = function(str) { for (let i=0; i<str.length/2; i++) { [str[i], str[str.length-1-i]] = [str[str.length-1-i], str[i]] } console.log(str) } reverseStr(str) 
この二つのコードは、どちらも配列として与えられた文字列を逆に並べ替えて、["y", "o", "h", "a"]と出力します。 アプローチが異なるだけで、プログラムの出力結果は同じなのです。一例目はwhileループを使って配列全体をループしていますが、二例目は配列を二分割し、forループで両端を置き換えているため、実行時間が一例目に比べて短縮化されています。
コードは、ソリューションを表現し、実装するためのツールに過ぎず、ソリューションそのものではありません。 哲学者ヴォルテールが「完璧は善の敵(Perfect is the enemy of good)」と表現したように、どんな問題でも解決方法は無限にあり、美しく完璧なコードを書くことにこだわらないことが大切です。パフォーマンス、メンテナンス性、正確性、読みやすさなどの点で他よりも望ましいものもありますが、多くの場合単にアプローチが違うだけです。プログラミングは、一般的にクリエイティブなイメージはあまりないかもしれません。しかし、実際は創造力と論理を掛け合わせることにによって多くの問題を解決することができるクリエイティブな分野だと思います。
「言語」の力
これまでお話してきたプログラミングと第二言語の習得に関する共通点は、他にもさまざまな分野に通用するのでは?と気づかれた方もいらっしゃるのではないでしょうか。プログラミングは多くの分野と同じように、 ある特性をもった一部の人だけのためのものではありません。 継続的に練習を重ね、好奇心を保つことができれば誰でも論理と創造力を掛け合わせて問題を解決したり、新しいものを作ることができる分野です。
私が複数の言語を話せるようになったことで得られた最大の収穫は、国境や社会を超えて人とのつながりを築く機会が得られたことです。これまでエンジニアとテクニカルライターの仕事をしてきましたが、新しい言語を習得することと同じように、コードを書くことで視野が広がることを実感してきました。プログラミングを学ぶことで、世界中の同じ「言語」を理解する人たちから学んだり、貢献することができます。
Twilioを通して、プログラミングへの障壁を下げ、コードを書いたことのない人からプログラミングの達人まで、幅広くテクノロジーの力をシェアしていきたいと思います 。
Twilio Blogに投稿してみたい方や、フィードバック、登壇、勉強会のお誘いなどお気軽に[email protected]までご連絡ください。開発中のプロジェクトに関してはGithub(smwilk)を覗いてみて下さい。