言語の選択をどうするか?
エンジニアの言語の選択についての悩み
言語を選択するというのは
ある程度習熟したエンジニアにとって悩みの種になる。
上級者になれば経験と偏見によりある程度最適な言語を選択し開発を行うだろう
初心者は自分の習得した言語を使わざる得ない。
だが、新しい技術でも2ヵ月程度あればとりあえず開発をスタートできるという技術者...
中級者レベルであれば言語の選択肢をどこにするか
というのはなかなか悩ましい問題だ。
偏見と覚悟を持って荒波に挑むのも良し
知的好奇心の赴くまま新しい技術を使うのも良し
ただ周りに迎合し、実績のあるものを使うのも良し
だが理由なく技術を使うのは少々エンジニア魂に反する。
我々は選択し続けなければならないし、なにか使う理由を常に探し続ければならない。
そしていつか見つけるかもしれない。最良のパートナーとなりえる言語を。
言語を自分の中で理解し、偏見を持って特徴を書く
私は以下のブログを見て素晴らしく感銘を受けた。
最高のプログラミング言語(または私は如何にして心配するのを止めてコードを愛するようになったか)
そして、私も中級者ながら言語について知識もついたので使った順に今の考えを述べよう。
(だが、私の偏見のコレクションであるので、貴方はお気に召さないかもしれないが。)
C/C++
- ゲームを作りたいとき
- 性能に対する不満があるとき
- 最高のエンジニアでありたいとき
私がプログラムという世界に初めて触れて、そして打ちのめしてくれた言語である。
複数の言語を使った今でも、この言語を超える恐怖に出会ったことが無い。
CとC++は違う言語だが、それでもこの二つが切っても切り離せない関係にあるので
この表記にしている。
c または c++ という意味だと思ってくれていい。
この言語に対する思いは色々あるが、少なくとも一度は触れてみると良い。
貴方は完全にコンピューターを操れる。
そしてコンピューターが万能でない事を知る。
assembler
- biosを作るとき
- IOT等で直接別のデバイスを操作したくなったとき
これのみを選択する機会はないだろう。
私が恐らく初めてプログラムとコンピュータについての結びつきを深く知る事になった言語だ。
そして勘違いされやすいが、アセンブラは命令や記法の使い方を覚えればいいという物ではない。
CPUにこの言語の使いやすさは左右される。
CPUが高性能であればあるほどアセンブラは複雑性を増す。(構成がという意味だが。)
この言語を学びたいときはPICなど小さいマイクロチップ等で学ぶと良い。
Java
- プロジェクトにJavaが使用され、資産がある程度あるとき
- JVMを使用したいとき
オブジェクト指向の世界に触れるという機会を与えてくれた言語
私が初めて出会ったときはさほど良い言語では無かった。
Cほど高速でも無かったし、資産もない。その上JVM等の仮想マシンに対する理解が少なかった。
だが数年後私の前に再び現れたとき、C++に打ちのめされた私の心を解放してくれた。
感慨深い言語でもあるし、オブジェクト指向の設計を考える時頭に浮かべるコードはJavaだ。
(当然、UML2.0でアウトプットするが)
Scala
- プロジェクトにJavaが使用され、資産がある程度あるとき
- javaを関数型に移行したいとき
- JVMを使用したいとき
関数型が一時もてはやされた。
(こういった意識のパラダイムは度々起こるが、実際は過去の理論が大衆に理解され始めただけだが。)
関数型の中では比較的多数のプロジェクトで使用されていると思う
(まぁ、ほぼJavaの資産があるせいだが。)
マルチパラダイム言語の一つであるため様々な書き方もできるのも要因だろうか。
だが、これは関数型だと言えるような構成をしているプロジェクトにはまだ出くわしていない。
PHP
- 誰かがこの言語を使いたいと言ったとき(多くは上司)
パフォーマンスは言語によって違い、そしてそれはアルゴリズムによって大幅に改善できる
という事を教えてくれた言語。
PHPの悪評はあったがそのたびに改善されてきた。なので昔にあった事は水に流そう。
(それでも私が自発的にこの言語を選択する事はないが。)
言語によってパフォーマンスは違う。
だが、現在のあらゆるコンピューターにおいて適切に書かれたアルゴリズムが困るほど遅いという事は殆どない。
この言語が遅くて嫌い という場合は貴方のエンジニアの基礎力が足らないのかもしれない。
この言語を勉強する時は是非N重ループ処理をやってほしい。
特に競技プログラミング系の問題を解くときに使用してアルゴリズムの大事さを再認識してほしい。
Ruby
- Ruby on Railsを使いたいとき
あぁ、日本の人は怒らないで!
でも私が使う場合は今の所(2020年)これ以外思いつかない。
Rubyは良い言語だ。面倒くさい箇所は丁寧にラッピングされ、私たちはそれを組み合わせれば良い。
そしてオブジェクト指向を正しく体現していると言える。
だが、Rubyは楽しく書ける半面、エンジニアの美意識に左右されるところがある。
私は細かい所を気にするので、他のエンジニアと対立してしまう。
Python
- 機械学習系のライブラリを使用する時
- OSSのプロジェクトに参加したいとき
- 手軽に何かを試したいとき
- どんな言語を使用しても良いと言われたとき
許されるなら常に触っていたいと思える言語。
なにかとRubyと対比されるが、その本質は
自由か、ルールか
にあると思う。Rubyは自由だし、Pythonは窮屈だ。
だがその窮屈が好きなので何も問題はない。
私が初学者が何でもいいので言語を学びたいと言われたらPythonを勧める。
美しいコードに触れる機会が増えるからだ。
だが、Pythonが嫌いだからといって決して美しくないエンジニアになるわけではない。
単に私と話が合わないだけだ。
C#
- Unityを使用したいとき
- Windowsのソフトを何か作りたいとき
好きな言語だ。
Windowsで何か開発をするならば常に選択していたい。
dear microsoft ;)
好きなのは本当だ。
LINQも悪くない。Javaに似ている点も私には好印象だ。
それでもマイクロソフトへの依存は不安が常に付きまとう。
あと冗長なのは、好みが分かれるところだろう。
私としては嫌いではない。がたまにうんざりすることもある。
JavaScript
- ウェブページを作るとき
言語仕様の独自性とその成長率においては他の追随を許さず
まるで鉱山を掘っているような言語だ。
ウェブページが持っていた役割を何度も変化させてきた
破壊者であり、創造者でもある。
マルチパラダイムであるため、様々な書き方ができる。
なので初学者はどの書き方が適切か分からず苦労しやすいのではないか。
少なくともウェブページを作る際
- JavaScript
- HTML
- CSS
これらの基本の組み合わせはしばらく崩れないだろう。
選択の基準
長々と記事を書いてはみたが、結局の所
何に重点を置くか?
であると言える。
- 資産
- 習熟度
- フレームワーク
まず
既存の資産はあるか yes-> 資産がある言語もしくは資産を手軽に流用できる言語
No
↓
作るプロジェクトを得意とする習熟度が高い言語はあるか yes-> その言語
No
↓
業界で良く使われているフレームワークはあるか yes-> そのフレームワークを使用する言語
No
↓
貴方が第一人者だ。覚悟と偏見を持って好きな言語を使いなさい
という形になるだろうか。
貴方も自分なりの選択する基準を持つと良いと思う。
そして是非記事にしてほしい。私も見に行くので;)
Discussion