Chienomi

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

既に何度か言及しているように思うけれど、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なんかよりはマシだろう。

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

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

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