教育と職業スキルと実用から見たプログラミング言語選択

前articleの続きだ。 なお、Swiftは使ったことがない。

Perl

オワコン的に言われることも多いが、柔軟で強力な言語だ。 今や仕事にはまずならないが、コンピュータを便利に使ううなら覚えておいたほうがいい。

シェルスクリプトで悩むより、perl -e(perl -neperl -peも)が早いことは多いし、Windowsでは作業スクリプトを書くのがとても楽になる。

性的型付け言語だが、数値・文字列間では動的で全体的にゆるく、学習もしやすい。 ただし、I/Oまわりと文字列処理は独特で、合理的すぎて人間の理解の先を行く感もある。説明はしやすい。

Python

割と有望な言語。ライブラリも豊富で色々やりやすいし、比較的楽ではある。

好き嫌いは割れる。Python的な正しさを求められるので、正解が決まっていたほうがいい人、統一されていてほしい人は好きだし、好きにやりたい人は嫌いだ。

文字列処理が苦手なので、特に日本人で文字列処理をしたい人には向いていない。

構文が独特なので学習には向かない。 仕事のクチはまぁまぁ多い。

PHP

「オワコン」「ダメ言語」。 元々の目的から外れて拡張された結果、ひどい継ぎ接ぎと矛盾になってしまった。 PHPは便利ともてはやされ、なんでもPHPに求めた結果、PHPでないものを要求されたのだ。 だから、プログラミング言語としてはかなり苦痛な部類に入る。

もちろん、本来PHPがするべきことをする(HTMLの一部を動的に生成する)ことには適している。 また、WordPressなどのPHPアプリケーションをいじるのにもスキルは必要になる。

構文自体は普通なので初歩を学ぶにはいいが、普通はもっと柔軟に書ける。 仕事のクチは多いが、一時はPHPだらけだったのでPHPエンジニア(ペチパー)の数が多く、口数は減っているので参入は結構きつい。

Ruby

最も稼げる言語。 柔軟さ、読みやすさ、強力さを兼ね備える。 日本人の作なので、日本語文字列の扱いが楽なのもメリット。 実行が遅いという欠点も、だいぶ埋まってきた。

隙のない言語だが、作者が言語マニアで、あまりメジャーじゃない言語を参考にしていたりするので、構文に普通でないところがあり、初歩学習には向かない。 また、GUI関連ライブラリが弱い。

稼げるのはRuby on Railsの話しで、Ruby全般に詳しくてもクチは少ない。

java

冗長な言語。 親hackerのSunが嫌hackerのOracleに買収され、Oracle次第になっている。

「javaのバージョンによる違い」に振り回されるがコンパイルされたJavaコードが異なるシステム上で動くことは多く、Java用GUIツールキットもあるためアプリケーションを書くのに便利。 しかも速い。 冗長でもめんどくさいことと、バージョンに振り回されるのが欠点だ。

日本では仕事のクチは最も多い気がする。 給料も高い。

C#

Microsoft版Java。 Javaよりもちょっと気が利いているが、だから良いとは言えない。

まず大抵Win32APIを叩くので、Windows用C#コードはWindowsでしか動かないし、Windowsのバージョンにもよる。

だから仕事のクチも少ない。

JavaScript

Javaとは関係ないが、Javaっぽくも書ける。 小さいが、言語設計を知る人なら舌を巻く傑作である。

シンプルで標準的な構文で、簡単なことを簡単に書けるが、かなり本格的な記述もでき、hackしがいもある。 DOMを使ったアクションで視覚化しやすいことを含めて学習には向いているが、オブジェクト指向部分はプロトタイプベースというキワモノで、実際便利だが、独特。

JavaScript自体がウェブブラウザと一体なわけではないが、実際はほぼウェブブラウザ上で使われるため、ウェブクライアントサイドスクリプトという独特な使われ方と共に内容も独特になるし、仕事ではそれが苦労にもなる。 一方で、そのために言語処理系の用意が簡単でハードルは低い。

ウェブをやりたい人は通じ用の言語とは別口で学ぶ必要が生じる。

仕事のクチはとても多い。

C

現用で最も原始的な(つまり大変な)言語。 現在は速度を求められるケース以外では使われなくなってきている。

意外と学びやすい(静的な言語としては)が、ポインタでつまずく人が多い。「値か参照可」はいずれ理解する必要があるにしても、メモリアドレスを直接障るのはPerlと比べてもハードルが高い。

Linux開発者になりたいのであれば避けては通れない。

C++

Cを使いやすくしたものだが、Cより邪悪だという人も多い。 Simula由来のオブジェクト指向は現代的でなくハードルは高い。

OSSでの採用率は高いので、OSSで活躍したい人は学んだほうがいい。

D

CもC++もJavaも嫌な静的派・速度派の人のための言語。 どちらかというとこれらを学んだ人のための言語でDからはじめめようという言語ではないかもしれない。

仕事のクチはほぼない。

Go

CもC++もJavaも嫌な静的派のDでない選択肢。 並列実行が楽で、あまり普通ではないが、ErlangやHaskellよりはマシなので、現代的な多プロセッサコンピュータの性能を活かすプログラムを書くための有力な選択肢となる。

初学には向かず、仕事のクチも稀。

Swift

iOSアプリの正式言語。 iPhoneだけを信じている人なら良いが、iOSアプリはSwiftでなくても書けるので、そこまで人気はない。

前代のObjective-Cに比べればかなりマシな言語で、iOSアプリ開発も楽しく行える。

仕事のクチは少ない。

Lua

PHPに似ている小さな言語。 小さいがよくできてきいて、プラグインなどによく使われる。 Lua JITの実行速度が速いことでも有名。

後発の言語だけあって既存の言語をよく研究しており、構文は現代的で記述も楽。

プラグインが自分で書けることを含め、使えれば実用性はあるが、仕事にはなりにくい。 初学には向いている方だと思う。

COBOL

古代言語。 当時から嫌われ者だった。変に冗長で英語っぽい言語で、今となってはすごく変な言語。滅ぶべき言語の筆頭とされているし、学びにくい。

ところが、金融領域で使わされているため、全然滅びない。 一定の需要があり、しかも若い使い手は稀なので、あなたが若いならマスターしておくと当面食いっぱぐれないかもしれない。

プログラミングことはじめ

既に何度か言及しているように思うけれど、Journalでは言っていないかもしれない。

プログラミングを、職業的スキルとして捉えて、はじめようとか、どうしたらいいかという人が多いのだが、ちょっとまって欲しい。 それは「野球って儲かるらしいから野球をはじめようかな」と言っているのに近い。

ブラックな労働環境で知られるIT業界だが、実際にブラックなところは多いし、それが当たり前になっているとも思う。

IT業界でプログラミングを行うのは、下級作業員であるコーダー及びデバッガ、プログラマ(PG)、そしてシステムエンジニア(SE)である。 コーダーは言われたものを打つだけだし、デバッガは書かない。管理監督者であるSEがコーディングするようだと人員が足りていない。

プログラミングの世界では、単純作業であるコーディングと、創造的なプログラミングを分けることもある。 コーディングでは特にスキルはいらないため、「IT土方」なんていう言い方をしたりもする。 日本のIT企業では(代わりの利きやすい)均質化を求められるため、PGやSEの仕事でも創造性は乏しい。

そうして部品のように扱われ、ひどい待遇を受けても、彼らは「プログラミングは楽しい」のである。 時給百円程度で使い倒されるアニメーターにも通じる部分で、いくら不況の就職難でも、プログラミングが楽しくなかったらやめているという人は多い。

基本的に彼らはスーパースターではなくても、好きで、オフにも勉強会に行ったり本を読んだりする人たちだ。それに対して「プログラミングができれば仕事がもらえる」という考え方はあまりに浅薄ではないか。

辛い仕事だからこそ、好きか否かが問われる。やってみることは良いことだが、プログラミングはそんなに浅くないし、退屈でもない。そして向き不向きがはっきりしている。

向き不向きを分けるのは、知的好奇心と制御フリークかどうかだ。自分が書いた通りにコンピュータが動くことに感動するのか、「ふーん」と思うのか、まだ自分ができない、やり方を知らない技を「どうやってやるんだろう」と思うかどうかは決定的な違いになる。

関心がわかない人はどこまで行ってもプログラミングには向いてない。そんな人が技術職についても人生が辛くてもったいないものになるだけだ。

まずはプログラミングを体験すること、そしてプログラミングの「センス」を作ることだと思うので、余計なことを書かなくても動き、汚いコードでも間違っててもできるだけ動き、現代のプログラミング言語に共通する構文で、できるだけ簡単にフィードバックを得られるかというのが言語選択のポイントだと思う。 私はJavaScriptがイチオシ、PHPやPerlも良いと思う。私の好きなRubyは、オブジェクトへの理解が必須になるので、このあまり教育向きではないし、C, C++, c#, Javaが良いとは全く思わない。

もちろん、「プログラミングってこういうものか」と分かってくれば好み相性で本格的に学ぶ言語を選べばいい。 とにかく、まずは楽しめ、プログラミングで遊べ、というのが私からのアドバイスだ。

では、いくつか例示してみよう。「画面にHello, world!と表示する」のは伝統的な最初の一歩だ。次のコードはPerlでもRubyでも動く。

print "Hello, world!\n"

少し気を利かせて、名前をきいてみる。Rubyだ。

puts "あなたの名前は?"
name = gets
puts "Hello, #{name.chomp}!"

Perlだとこうなる。my $nameと言っているが、内容はyour nameだ。

print "あなたの名前は?\n";
my $name = <>;
chomp($name);
print "Hello, $name!";

もうちょっと気の利いた例だ。 別にHTMLを用意する必要があるが、ボタンを押すと「私のことは好きですか?」ときき、「OK」「キャンセル」が出る。OKなら終了だが、そうでないと「えー、またまた」と表示し、くりかえすJavaScriptだ。

var btn = document.getElementById("TheBtn")
btn.onclick = function() {
  while(! confirm("私のことは好きですか?")) {
	  alert("えー、またまたー")
	}
}

ちなみに、2番目をRubyらしく「ちゃんと」書くとこうなる。

STDOUT.puts "あなたの名前は?"
name = STDIN.gets.to_s.chomp
STDOUT.puts "Hello, #{name}!"

Rubyらしく丁寧に書くのはこの規模では無駄もいいところだ。だから教育には向いていない。

class Hello
  def initialize
    name = ask
    hello(name)
  end

  def ask
    STDOUT.puts "あなたの名前は?"
    name = STDIN.gets
    name.to_s.chomp
  end

  def hello(name)
    puts "Hello, #{name}!"
  end
end

それでも静的型付け宣言やらのいるC, Java, Pythonなんかよりはマシだろう。

なお、文系理系の話もされるので言及すると、プログラミングは論理的思考力は求められるが、作業自体は文系である。 ただし、内容によっては数学の素養が求められるほか、チューニングなど理系の作業もある。

「文系プログラマ」を侮蔑語として使うエンジニアもいるが、その人は(自分で書いたコードでなく)出身学科くらいしか自己を立脚するもののない憐れな者なのであり、そのような人が文系である私より良いコードを書くのは稀であるから心配はいらない。

強いて言うなら、自分で小説を書く人や、絶えず新しいアタリの本を探している人は向いているし、夏目漱石を賛美するだけの人は向いていない。