プログラミングで複数言語学ぶことは大事なのかについて考える

初めてNoteを書きます。書き終えて思ったことは、「これ、公開していいのかな…。」です。全部において知識不足+下手な文章ですがお許しを。

様々な人がプログラミングをする現代

 趣味に始まり、仕事でプログラミングをしている人まで。様々な人がいると思います。私も趣味でプログラミングをしているうちの一人に当たります。

「プログラミングで複数言語学ぶことは大事なのかについて考える」とタイトルにある通り、今から考えていこうと思います。

私が考えているプログラミングとは

 まずは分からない人向けにプログラミングとは何かを私なりに解説します。
私の考えるプログラミングは、「やりたいことをやりたいように実現するためにする」かなと思っています。

"コンピュータープログラミング(英語: Computer Programming)とは、ある特定のコンピューティングの結果を得ることを目的として、実行可能なコンピュータープログラムを設計・構築するプロセスのことである。"

プログラミング - Wikipedia

というように、Wikipediaでは「特定のコンピューティングの結果を得ることを目的として」と、結果を得るために行うもの、それがプログラミング。という説明になっています。そこは私の考えるものとは多少違うのかなと感じます。

なぜこう考えるのか

 プログラミングは、ある意味、「機械との対話」であるのではないかと感じています。自分が処理を入力して運用したら、その"書いた通り"の結果を返してくれる。聞きたいことがあれば、実際に知ってそうな人に聞いて、答えを求めますよね。だから、そういった対話の部分が「やりたいことをやりたいように実現するためにする」という部分になるのかなと思います。

脱線してしまいますが、私はなぜわざわざ"書いた通り"と強調したのでしょうか。それは、

"プログラムは思った通りには動かない。書いた通りに動くのだ。"

どなたの名言だったかは失念してしまいましたが、この通りであるからなのかな。と私が思っているからです。

さらに脱線していきますが、どういった話だったかこれまた忘れてしまいましたが、C言語では、同じような書き方で同じような結果が返ってくると思っていたのに、処理が異なり、結果も違う。といったことが起こる構文があったかと思います。
(記憶力のなさが悔やまれる)

だから結果が変わってくるなんてことが、同じことを書き表したいだけなのに起こってしまうのだとか。

さらにさらに脱線すると、違う処理が行われる同じ名前の関数を使ってしまって、どの処理の関数を使えばいいのか分からなくなり、結果的にエラーが出る。というのにも似ています。

「Service」とかいう関数名とかだと、ほかのものと混ざりがちです。自分でもその関数を定義するかもしれませんし。

//Javaにて
import java.security.Provider.Service //一つ目のService
import com.google.common.util.concurrent.Service //二つ目のService

もし「Service」という関数を使うなら、しっかりと名前空間(?)を前の方から指定してあげないといけません。もしくは、「この中では「Service」という関数はこの処理の方の関数を使用します」と宣言してあげて使うなどです。

import static java.security.Provider.Service;

これであれば、このコードを書いた中ではServiceは「java.security.Provider.Service」の「Service」が優先されます。
二つ目の方を使いたければ、「concurrent.Service」と書くか、一度しか使わない等であれば面倒かもしれませんが、フルで指定すると事故が無くなるかと思います。

com.google.common.util.concurrent.Service();

例えるなら、人間同士で会話をしていたら、同じ単語で色々な意味を持つ単語を使っていて、話が食い違ってしまう。といったものですかね。

A「I like "Spring"!」
B「Ooh, I like too! yeah!」
A「Spring is good feeling.」
B「I think so too.」
A「And the cherry blossoms bloom in Spring!」
B「Ah, You are talking Spring that season? I thought you were talking about the Fountain, right?」
A「Yes, Sorry!」

日本語でいい文章が思いつかなかったので英語で適当に考えてみました。春について話していたのに、泉だと勘違いしていましたね。私に英語力はないので多少文法なり間違えているところが間違えているところがあるかもしれませんが、そこは目をつむってください。フィーリングで感じ取ってください。(笑)

脱線しすぎましたね。全部戻して、本来の筋に戻しましょう。

プログラミングで複数言語を学ぶメリット

 現実世界の言語学習と結び付けて考えてみましょう。
ただし、ぱっと思い浮かぶ日本語以外に英語を学ぶ理由とは結び付けないほうがいいかもしれません。私たちが日本語以外に英語を学ぶ理由には、「グローバルに活躍できるようにするため」だとかの理由がメインになってしまっているのかなと思っているからです。

これは、私がプログラミングで複数言語を学ぶメリットについてとはそれほど関連しません。ただ、もちろん複数の言語を学ぶことでそれぞれの環境に適応してコードを書き分けられるようになることで、適切に作れるから。という理由が当てはまります。

ただ、私が考えていたものからはまた脱線してしまいました。
私が考えていたのは、その言語の特徴と、その言語の性格を知ることが出来る。というのがあると思っています。また別のものももう一つありますが、それはこの下で。

例えば、Javaなら、

public static String Hoge(){
    return "Hoge";
}

という中括弧を使った構造になっていますが、Pythonなら、

def function():
    return "Hoge"

と、中括弧ではなく、インデントで構造を表しています。

またまたうろ覚えで申し訳ないのですが、中括弧を使う言語で、結局「インデントを使ってプログラムを見やすくするならインデント自体を中括弧の代わりにすればいい」のような雰囲気で効率ときれいさを求めているのかなと。もちろん、これ自体はプログラミングをするうえで全くもって必須ではありません。あくまで言語の仕組みや背景などについてのお話ですね。

先ほど言わなかったもう一つの方を取り上げましょう。

それは、
「どんな言語でも、大体読めるようになる+書けるようになる」
というのが大きいかなと思います。

もちろん、やったことのある言語なら当然かもしれませんが、語族的に少々異なる部類の言語を二つ三つ習得していれば、さらに違う語族的なものが出てきても、今までの感覚で大体把握が出来るようになるのかなと。

まぁ、これって実際のところ一つの言語しかやらない人には一切関係のないお話ではあります。でも、楽しむという点で、言語を新しく知る。というのはいいかもしれません。

プログラミングで複数言語を学ぶデメリット

 じゃあデメリットは何か。と。

それは、一つの言語に尖れないことで、言語の神髄であったりとか、奥深くの領域・達成度であったりに到達できないことかな。と。

やりたいことを実現するには、言語の習熟度が高くないと実現できないこともあります。今ではAPIやライブラリで簡単に呼び出すだけで使えるものがありますが、もとをただせば、それを作っているのはそういった言語であるとか、それに限らず何らかの習熟度の高い方々です。そういう意味では一つに尖りまくって全部を操れるくらいになるには複数の言語を習得していたら時間が足りないかもしれません。

まとめ

 結局のところ、完璧にすべてを出来るようになるとは思えませんし、学習をどんどん進めてくると、ダニング=クルーガー曲線のような状態に陥って「チョットデキル(レベル不明)」になってしまいますから自分のレベルを推し量ったり、出来ることを考えたりするのは難しいのかなと。

だからこそ、自分でどのぐらいやりたいか、と思うのかが大事になってくると思います。複数言語を学ぶことは、どのぐらいやりたいかという自己との相談で決めるのがいいのかもしれません。メリット・デメリットで決められるようなものではないと思います。このサイトをお読みくださった方には申し訳ないですが、これが私の結論です。

それこそ、言語習得論のようなものになってしまいますし、リアルで話されている言語も然り、プログラミング言語も然り、それらは終わりのないもので、進化していくものなのです。だから自分の意志で歩みを進めていってください。私が言えたものではありませんけども。(笑)

では。良いプログラミングライフを。

良ければサポートよろしくお願いいたします。いただいたサポートは活動費として使用させていただきます。