Program プログラム言語

はじめに

私がQiitaなどに投稿した内容をこのページにまとめていきます。

まだこのページしかありませんが、徐々に増やしていきます。

本ページはプログラムとそれにまつわる技術の概要を記載しておりますので、概要について把握したい方は見てください。

プログラム

プログラムというとコンピューターの中で動いている何か・・・という印象を持っている方も多いとおもいます。

実際にその通りではありますが、それらのプログラムにも以下のような特徴があります。

言語 特徴
PHP 【概要】
動的(プログラムが入る)なWebサイトを作るならPHPで作ると言われるほど流行ったプログラム言語。
PHPはもともとHTMLを加工しやすように作られた言語で、筆者は2000頃にPHP4.3で自分が所属するサークルのホームページなどを作った。
簡単なホームページを作るために出来ている言語なだけあって初心者が手を出しやすかったが、PHP5以降はオブジェクト指向と言われる概念を取り入れたため初心者が学ぶには少し敷居が上がった。(それでも敷居は以前低いままだ。)
またスクリプト言語(*1)であるため、環境(Windows,Linux)を選ばず動作するというのも大きなメリット。

【現状】
現状でも多くのWebサイトがこのPHPで出来ている。一番有名なサイトはFacebookや楽天。大手のサイトでも活用できるほどの柔軟性を持っている。
しかし、後述する「Ruby on Rails」の登場でスタートアップに使われるケースは徐々に減りつつある。

【プログラマーの現状】
PHPはスキルが極端に二極化がすすでいる言語。敷居が低いため初心者多く、PHPを熟知している高スキルの人ととりあえず使えるという低スキルの人の差が激しい言語。
初心者と上級者のコードが入り混じる可能性が高いため、あまり巨大なサイト構築に多くの開発者を投入するとデスマーチに突入する可能性が高い。
私の印象では低レベルのプログラマーが多い気がする。
Java 【概要】
C言語と呼ばれるプログラムは理解が難しく、メモリ空間やポインターという低レイヤーの技術を理解する必要があった。
Javaはそのような低レイヤーを意識しなくてもプログラムができるように改良されたプログラム言語である。
プログラム構文も基本に忠実であるため学習にも向きますし、中間コンパイル言語であるためスクリプト言語よりも高速に動作するという特徴を持つ。
完全にコンパイルを行わないため、スクリプト言語同様に環境(Windows,Linux)を選ばず動作するという特徴も持ちあわせる。

ただし、一方でモダンな書き方ができないためプログラムコードが長くなる。すなわち開発コストが高いという欠点も持ち合わせている。
また、サービス運用の敷居も高いためスタートアップには向かない。
その欠点を補うため、ScalaやGroovyというJavaをラップしたような言語も出てきている。

【現状】
Javaはコンパイル言語であるため、ある程度大人数の開発者を投入してもサイトの構築ができるのが特徴です。
コンパイルによるチェックやコードの静的チェックなどが一番進んでいる言語でしょう。
StrutsやS2Strutsといった古いフレームワークを未だに使っている現場もあるくらい耐久性に優れているのもJvaaの特徴でしょう。

一方で、フレームワークの開発が滞っている印象もある。SpringとPlayが現状で使われていると思うが、それ以外のStruts系のフレームワークはほとんどすべて開発が止まっている。
大規模で多くの人間を集めないと構築できないサイト以外ではJavaを使うメリットは少なくなってきたでしょう。

【プログラマーの現状】
Javaは作業分担に向いているため、大規模開発が行いやすい。
その弊害で、自分の作業範囲のプログラムは出来るがサーバー構築などの方法は知らないというプログラマーを多く輩出してしまった。
またキラーフレームワークだったStrutsはそのままでは使いにくく、会社独自にカスタマイズするケースが多く技術者の常識が会社ごとに違うところもある。
そのため、プログラマーのスキルがマチマチという印象を受けるのが現状でしょう。

会社で中核の処理(フレームワークのメンテナンス等)を行ってきた人以外は作業プログラマーが多いのが現状なのではないでしょうか。

ただ、初めにも書いたようにJava自体の言語仕様は基本である上に処理速度が必要な局面では必要になりがちな言語です。
また、(日本では)いまだにJavaが使われている言語が多いため学んでおけば役に立つ事は多いでしょう。
Ruby 【概要】
Ruby on Railsと言うフレームワークが出てから一気に広まった言語。
PHPと同じスクリプト言語だが、すべてがオブジェクトと言う点が違う。
このすべてがオブジェクトと言う点とオブジェクト指向型開発がマッチして人気を産んだ。
PHPに比べて処理速度が若干遅い(Javaとはかなり差がある)が、プログラムが書きやすく理解しやすい構文であるため開発コストが安いのが特徴だ。
また、この特徴を活かして「Chef」や「Capistrano」といったインフラ系のツールでも積極的に活用されている。

【現状】
現時点で一番活発的に活動している(Railsも含めて)言語といっても過言ではないくらいアップデート頻度が高い言語。
なので追従しているとセキュリティーホールができにくく、いつの間にか処理速度が上がっていると言う恩恵にあずかれる。
一方で、アップデートに追従する事自体にコストが発生するため安定しにくいところもある。
Rubyのフレームワークと言うと「Ruby on Rails」一択と言うほど優れたフレームワークがあるため、技術的に安定しておりスタートアップに向いている。
(他の言語で開発されているフレームワークに大きな影響を与えたのもRuby on Railsだ!)

【プログラマーの現状】
Rubyは小規模からやや中規模向けサービスまで一人でメンテナンスができるほど開発効率が良い言語だ。
そのため一人のプログラマーが開発して運用まで面倒を見ることが多く、広範囲までサポートできるプログラマーが多い。
スキルが高めのプログラマーが多いが、一方で低レイヤーの部分を知らないプログラマーも多い。
そのため、Railsに則った開発は得意だがRailsから逸れると突然下手なプログラムを書いてしまうプログラマーも多い。
ハイスペックなハードウェアが出ている今の世の中とマッチしやすいのではないだろうか。
Groovy 【概要】
概要を語れるほど知らないので、私が知る限りの情報を書きます。
私個人的にはJavaの言語仕様は嫌いではないのだが、構文が面倒であまり好んで使用しません。
しかし、GroovyはJavaとの親和性が非常に高くクロージャや高階関数が使用できて構文が分かりやすいため気にいっている。
また、例外のJavaで当たり前に書くthrowsを記述する必要がないなどJavaの痒いところに手が届き最終的にJVMで動くと言うところも気にいっている。

【現状】
上記で書いた通り僕個人的にはお気に入りです。しかし文献の数などはあまり増えていないのが現状なので、今後流行るかどうかは微妙なところでしょう。
その他Java系言語 こちらも概要を語れるほど知らないので、私が知る限りの情報を書きます。

Java系言語で有名なのは「Scala」でしょう。
一時期は次世代言語と言われてましたが、私が知る限りでは最近の状況はイマイチに見える。
関数型言語でモナドなどの概念も取り入れていて、モダンな言語だとは思うのですが・・・私個人的には構文がわかりにくいところがウケないきがする。
Playフレームワークがある限りは元気かもしれませんが。。。

一方でkotlinは最近元気になってきた言語だと思う。
kotlinはもともと後述するSwiftよりも古い言語だったのだが「Swiftが出てからSwiftに似ている言語がある!」と言う感じで流行った感じがする。
現状ではAndroid Studio(IntelliJ)がサポートしているため、今後Android開発がJavaからKotlinに移っていくのではないかと期待している。
objectiv-c 【概要】
プログラマー泣かせ。
当時、iPhoneが発売されiPhoneの開発を始めた頃に言われていたのはこの言葉だった。
今までJavaやPHPなどのようなC言語の流れを汲む構文に慣れていたプログラマーは、objective-cの構文には馴染めなかった。
それほどに特殊に見えた構文にも関わらず、Apple社がこのプログラム言語を推奨してiPhone開発を推し進めた言語。

慣れるとある程度使いやすくはなってくるものの、コンパイル言語の割にはバグが見つけにくいというところがある。
一方でモダンな言語仕様には追従しているためJavaより柔軟な対応ができるため、Javaに比べると開発コストは低め。

【現状】
スマホ市場は需要と供給があっていないため、プログラマー不足の声をよく聞きます。
後述するSwiftと言う新言語が出てきましたが、依然としてobjective-cの需要は高くプログラマー単価も高めである。

【プログラマーの現状】
上記に書いている理由で、objective-cはできるけど他の言語はできないと言うプログラマーが多々います。
他の言語をやってた人が流入するよりも、初めて学んだ言語がobjective-cだったと言うプログラマーが多いため知識が偏っているケースが見受けられる。
また、スキルレベルもまちまち。
objective-cはC言語に近いレイヤーで動くため、メモリやポインタの挙動をある程度把握しておく必要があるのだがその理解ができていないプログラマーもそれなりに存在している。
ただし、基本的にはスキルが高いプログラマーが多い。(母体数が少ないため要員確保が難しいが・・・)
Swift 【概要】
2014年で一番衝撃的な事件の一つが、Swiftの発表だった。
objective-cの発展系言語とは思えないほど美しい言語として仕上がっていた。
今年(2015年)に入ってSwiftはバージョン2まで進化を遂げていて、年内にはオープンソース化される予定。

objective-cで書きにくかった高階関数やクロージャの部分がすっきりかけるようになってたり、Enumがとても強化されていたり、Optionalが言語構文でサポートされていたりするため開発効率、堅牢さの両方が上がってます。
私が使っている限りでは、大きな問題が発生していないのでそろそろobjective-cからswiftへ移行する時期は近いかもしれない。

【現状】
個人プログラマーにはずいぶん浸透しているが、企業レベルになるとまだ使用するのは見送られている印象を持つ。
objective-cとは構文が別物であるため、objective-cからではなくRubyなどからプログラマーが流入しているような印象も受ける。
(objective-cとswiftは構文以外の親和性はとても高いので、objective-cからの流入はそこまでの障壁にはならない。)

【プログラマーの現状】
Swiftプログラマーが募集されているところをほとんど見たことがなく、本格的に使っている現場もほとんど知らないため現状は不明。
(サイバーエージェント社などの一部の企業が記事を公開しているので、ある程度若い会社は内部で実験を行っているのかもしれない。)
ただ、技術者の発信する情報は多いので今後発展していく可能性は高いだろう。

余談だが、現時点で私が一番気に入ってる言語はSwiftである。
javaScript 【概要】
Webサービスを作る上では切り離せないほど重要な言語。
主にクライアントサイドのプログラムを作るときに使用するが、node.jsのようにサーバーサイドでも活躍する言語。
(サーバーサイドでは使い方が異なるため、同じJavaScriptでも別の言語にも見える・・・)

昨今では一人で一部分のプログラムだけを扱うことは少なくなり、サーバーサイドとクライアントサイドの両方を見ることが増えてきたため大抵のプログラマーが扱えるのも特徴。

【現状】
JavaScriptは「おまけ」的要素だった時代もあるため、未だに軽視されている現場も少なくない。
実際、私もある時期まで軽視していた言語である。
しかし、今現在はAjax通信でREST設計をするJavaScriptのフレームワークも出ているくらいで軽視できないほど重要なポジションにいる。

【プログラマーの現状】
軽視されやすい言語であるため、コードレビューなどがほとんどされない言語。
そのため、プログラマーのスキルがとても見えずらく周りのスキルがよくわからないのが現状である。
ただ、作業的現場で仕事をすると信じられないほど稚拙なプログラムを書く人もいるので全体的にみるとあまり高スキルの人がいないのではないかと思う。
CoffeeScript 【概要】
CoffeeScriptはJavaScriptを書きやすくしたシンタックスシュガー。
JavaScriptで書くと冗長になりがちな部分を簡潔に書けるようになっている言語。
そういう意味ではScalaやGroovy、kotlin等と同じポジションにいる。

【現状】
CoffeeScriptだけを使うような局面はなく、使う必然性もないため現状と言うようなものはない。
ただ、Railsを扱う上ではデフォルトスタンダードであるためRailsを使っているプログラマーはCoffeeScriptも扱えるプログラマーが多い。

【プログラマーの現状】
JavaScriptで書くと面倒臭いと言うプログラマーがCoffeeScriptを使うので、使っている人は先進的な性格をしている場合が多い。
逆にCoffeeScriptが読めないプログラマーはJavaScriptもろくに書けない場合もおおい。
(ある程度のレベルのプログラマーなら書けなくても読むことはできるはず。)

もちろんだけど、CoffeeScriptだけができるプログラマーを求める現場は皆無である。

※2015年11月現在

*1・・・スクリプト言語はプログラムが実行される時点でプログラムの解析を行います。そのためプログラムの修正を行った時点で処理が反映される特徴があります。しかし、実行時にプログラムの解析を行うため処理が遅いというデメリットもあります。

*2・・・コンパイル言語は人が作ったプログラムをOS(WindowsやLinux)が理解できる形に変換させてから実行するプログラムです。OSが理解しやすい形に変換されているため処理は高速に動作しますが、事前にコンパイルという作業を行う必要があるためプログラムの反映に時間がかかります。