DIVE INTO CODE

2020年01月08日

ひとつの言語だけ使える人、未熟にも複数言語を勉強している人

Aws4 request&x amz signedheaders=host&x amz signature=29ad89d6bf094afb8b00304256628db2f61d305a689e4a0aafa2fcda26a548a1

プログラミング言語はひとつのものを究める方が良いのか、複数の言語をそれなりに使えた方が良いのか。プログラミングスクールのDIVE INTO CODE代表の野呂と、スナップマート株式会社 取締役CTOの星 直史様との対談で解説します。

【こんな方におすすめ】
・スキルアップするには何をすれば良いのか迷っている方
・就職や転職をする際に、今と違う言語を勉強しておいた方が良いのかと不安な方
・他の言語を学ぶにしても、何を選んだら良いのか分からない方

【目次】
1.アルゴリズムは変わらない
2.他の技術にスイッチするタイミング
3.何を学ぶかを戦略的に選ぶ
4.まとめ

■話し手
DIVE INTO CODE 代表 野呂 浩良
スナップマート株式会社 取締役CTO 星 直史様

アルゴリズムは変わらない

受講生に、「ずっとRubyをやってきたのにJavaの仕事のオファーをもらった」と残念そうにされる方がいらっしゃいます。

「ひとつの言語に習熟すると、他の言語でも変わらないのではないか」とは結構思います。例えばRubyに習熟した人が「PHPやってみて」と言われたときに、RubyとPHPって実際にできることは変わらないです。具体的な書き方は違いますが。
ひとつの言語を学んでいく中で、「プログラミングってこういうことなんだ」と抽象化して考えることができれば、複数言語を習得することは可能だと思います。

複数言語を扱うことのできるメリットは、求められる環境によると思っています。例えば受託開発(SIer)の会社のように、クライアントによって複数の言語を扱わなければならない環境で、「自分はこの言語ができます」と言えることはメリットと言えます。

ひとつの言語を学べば、どの言語もコンピュータを動かすためのマシン語から派生して人間が分かる言葉にしているだけなので、共通しているところはあると。確かに書き方など覚えるところはありますが、作法や「どういうふうに実装していけばいいか」というステップはだいたい同じということでしょうか。

そうですね。アルゴリズムは言語を限定しないですよね。その時点で「プログラムを組み立てるための思考プロセスは言語と関係ない」と言っているのと同じかなと思います。
とはいえ、初学者の方やこれから就職する方にとっては不安なトピックだと思います。Ruby on Railsを何十万も払って一生懸命学びました!だけど「いいな」と思っている会社がPHPを使っている…「せっかくRubyを学んだのにPHPか…」というバイアスはかかるかなと思います。

そうなんですよ。

実際、弊社で採用するときに「2年、PHPをやっていました」という方が面接にいらっしゃるんですが、実は言語は関係ない。ほぼ見てないです。ただ、面接の途中に「弊社の開発はRubyなんですけど大丈夫ですか?」と聞くことがあるんですが、それは今話したようなことが説明できるといいです。「書き方を覚えるだけなので大丈夫だと思います」と答えられる人は、言語は関係なく抽象化した考え方ができるのだと見なすことができます。

なるほど。
ここで確認しておきたいんですが、ひとつの言語にこだわってそれだけをやることで見えてくる世界と、使う言語を変えてもレベルアップできるものとは違うと思うんですよね。
前者はコミッターになるような人、言語の仕様まで分かっているという人。そういう人はそれなりに長くやっていかないといけないと思います。後者はビジネス面の問題解決をする人、求められる機能を作っていこうとする人。その場合は言語に関係なくアルゴリズムが分かっていれば、どの言語でもレベルアップできると思っています。大多数の方は後者を前提にしておいてよさそうですね。

今までの話はどちらかというと後者を前提に話していました。
若手と話していると、スキルアップの最上位レベルをコミッターにしている人がいます。もちろん、ひとりの技術者として技術力を高めるという意味では間違いないです。プロダクトによって、「この言語が良い」「フロントエンドを学んだ方が良い」「バックエンド、インフラをやった方が良い」という局面があると思うんです。そういうときはスイッチした方がいい。「どこで何を求められるか」「どういう価値を求められるか」ということをまず念頭において、応えられなくなりそうなときはすぐに移った方がいいです。

他の技術にスイッチするタイミング

「あえて他の言語をこのぐらいの周期でやった方がいいんじゃないか」といった基準ってありますか?私はあまり明確な基準を聞いたことが無いのですが。

「パラダイムが変わったとき」ですね。
インフラの例で言うと、「オンプレミスでやっていたのがパブリッククラウドになってきた」「 Chefのように自動化ツールが出てきた」「コンテナ技術が台頭してきた」、そういう時です。同じインフラをやっていることには変わりないんですが、そもそも思想が変わってきている。そういうレベルになったら新しく学んだ方がいいですね。インフラだと3~4年の周期ですね。

なるほど!

フロントエンドだと1番分かりやすいパラダイムシフトはReact.jsです。仮想DOMという、これまで使ってきたjQueryとは明らかに違う技術が登場しました。そのときはReact.jsを習得した方がjQueryを使い続けること以上にメリットがあると考えました。そしてこのときに「React.jsかVue.jsか」は大きな問題ではありません。

React.jsとVue.jsは仮想DOMという点では同じ分野のくくりですからね。
そう考えると、例えばオブジェクト指向の言語群って「オブジェクト指向」という分野が同じだから、複数学ばなくても良いということでしょうか。「フレームワークに依存するから、フレームワークのパラダイムシフトがあったとき」ということになりますか?

技術選択する際に「この問題を解決するにはこれを使うと良いよね」と言えなくてはいけないと思うんです。そのためには技術の違いや特徴を把握しておいた方が良いです。分かりやすい例で言うと、Rubyを選ぶかJavaを選ぶかは、動的か静的かで変わってきます。あとはNode.jsだと並列処理が得意・不得意とか。

それが先程言われていた「(問題解決するための)価値を求められる」ということなんですね。

何を学ぶかを戦略的に選ぶ

例えば、2年くらいPHPをやっているひとりのエンジニアがいたとき、「Rubyもやっておいた方がいいのではないか」と勉強会に行ってみたり、「最近Pythonのシェアが伸びているからPythonやっとかなきゃ」と学んでみたり、というよりは、何か解決しなければならない問題があって、そのために学ぶ方が良いということでしょうか。
戦略的に学ぶ言語を切り替えている人ってあまり聞いたことがないんですが、ほとんどが問題ベースでの切替なんでしょうか。

ほとんどはそうだと思います。ただ問題の種類として、技術選定のようにレイヤーが高くなってくると起こりうるんですけど、先程もお話したように特徴を理解して最適なものを選ばなくてはならないというときは…

触っておかないと、知っておかないと選定できない、ということですね。

そうです。最近、自分が学んだのはGo言語ですね。業務でもプロダクトでも使っていませんが、学ぶ必要性がありました。
動的/静的の軸、並行処理のサポートがあるかないかの軸で切ったときに、Ruby、Java、Elixir、そしてGoがそれぞれ割り当てられます。縦、横、斜めの違いを学べば対比ができるようになります

Image from Gyazo

おもしろいですね!最近、Elixirの普及推進をされている方が、いろんなところでイベントをされているのをSNSでよく見ます。4象限の観点では触れておいた方がいいですね。
ありがとうございました!

まとめ

・どの言語でも、プログラミングに必要なアルゴリズムは変わらない。抽象化してとらえることを心掛けていれば、どんな言語でも使える力がつく。
・「問題を解決するために何を求められるか」「どういう価値を求められるか」ということを踏まえて、学ぶ技術を選ぶ必要がある。
・パラダイムシフトに合わせて他の技術にスイッチする。

闇雲に学ぶのではなく、自分が目指す方向、求められている価値に合わせて戦略的に学ぶ対象を選んでいくことが大事なのですね。
言語の学び方については、下記の記事も合わせてぜひご覧ください!
「複数のプログラミング言語を並行的に学ぶことは効率的なのか?」の記事はこちら

スナップマート株式会社の企業HPこちら
星様のTwitterこちら

DIVE INTO CODEの公式HPこちら
DIVE INTO CODEの無料カウンセリング予約こちら

DIVE INTO CODEのことをもっと知ってみませんか?