文系プログラマはそんなところで挫折しない
プログラミング
- TOP
- Old Archives
- 文系プログラマはそんなところで挫折しない
原文に言及
Paizaのプログラミングの勉強を始めたときに、文系が挫折しやすい7つのポイントという記事に猛烈な違和感があり、ついでなので巷に溢れる理系だ文系だ文系プログラマだとかいう風説を否定していこうと思う。
既にTwitterで言及されたりしているのだが、明らかに「プログラミングの勉強を始めたときに、文系が挫折しやすい7つのポイント」ではなく、「プログラミングの勉強を始めたときに、文系の私が挫折した7つのポイント」だ。
予め言っておこう。私は文系である。脳はバリバリの理系思考だが、興味分野は文系であり、教科としての得意分野も文系科目なので、世の中的には文系ということになる。だが、私は2歳の時にはプログラミングをやっていたし、幼少期は際立って天才的だったのだが、それでも言語発達よりもプログラミング習得のほうが早かった。ひらがなをマスターしたのは4歳になってからなので、ひらがなよりもアルファベットが先にあった。
Hello, World!
別にそのようなことは微塵も思わないし、それは文系か理系かということとは全く別次元のところにある。
簡単にいえば、「テレビが大好きな人はプログラミングに向かない」のだ。
テレビを視聴している時、脳は停止している、ということが既に研究により判明している。だが、おそらくこれは真実ではない。私はテレビを観ていようが、非常に活発に様々なことを考えている。そして、その速度に追いつかないことや内容が稚拙なこと、私の疑問に応えないことにいつも苛立っている。だから、私はTVが大嫌いだ。
対して、ゲームが好きな人は向いている。ドライブなら助手席が好きな人より運転席が好きな人が向いているし、絵を見るのが好きな人よりも絵を描く人が向いているし、ラジコンが好きな人はかなり向いている。
要は自分が支配し、操縦することが好きな人は向いていて、受け身な人は向いていない。
さらにいえば、好奇心の多寡が重大な違いにもなる。
この節において、この人は単に受動的すぎて、しかも好奇心によって駆動してもいない、テレビが好きなタイプであるために受け入れられなかった、というだけだろう。
だいたい、そもそもこれを「暗記する」と考える時点で向いていない。「どうなっているんだろう」と思ったあなたは向いている。
#include <stdio.h>
int main(void)
{
printf("Hello, world!");
return 0;
}
おまじない
これは、よく使われるが、よく知られた悪しきものである。 単にきちんと説明する力がないのだろう。理解させる必要がないのかもしれないが。
C言語の#include
は、含める、そのまま「取り込み」に用いるものだ。stdioはSTanDard
Input/Outputであり、読み込んだり、書き出したりする機能を持っている。
この機能を利用するために
#include <stdio.h>
と書いておく。
C言語の基本部分はただの骨組みだ。機能は別パーツになっている。これを取り付けるのがこの作業だ。
型
「何でも入る型ひとつあればいいのでは」は、疑問としては正しいし、意見としても構わない。汎用型を持っているものもあるし、Perlは静的型の言語だが、スカラー変数にはスカラー値であればなんでも入る。
これは思想的な問題である。C言語がそうなっているだけだ。 もちろん、メリットはある。気になるならそれを調べればいいし、そんな簡単に思いつくことは誰かが試している可能性が高いのだから、それを調べてもいい。
だが、躓きはしないだろう。学習を困難にさせる部分であり、なるべく型を意識させない言語というのは、私がプログラミングを教える上で重要な条件にはなっているが、別にそれは文系だからという問題でもない。
なお、なぜ型があるか?という質問に対する応えは明瞭だ。
トマトは冷蔵庫にいれなくてはいけないが、猫を冷蔵庫にいれるわけにはいかない。別な扱いが必要だと区別する必要があるだろう?
セミコロン
これも、行の切れ目が文の切れ目ということでいいじゃないか、はそのような思想の言語はたくさんある。
Perlは常にセミコロンで終端する。各種UNIXシェルは通常、行末を文ターミネータとして扱う。
RubyやJavaScriptは、「文脈的に次が続きであれば続き、そうでないければ終端とみなす」という扱いだ。
どれも一長一短だ。Perlの統一はわかりやすいが、同時に忘れやすい。
my $a = "Something";
print $a;
シェルの分割されるのは思わぬトラブルの元だ。
text="Hello,
This is Aki!"
これはエラーになる。でもZshではエラーにならない。
Rubyであればこういうこともできる。
array = [ "a", "b",
"c", "d"]
JavaScriptも同じようにできるが、シェルで分割される文字列の改行は許されない。
よほど変なルールならともかく、C言語の場合はだいたい「セミコロンをつける」で統一されている。 それを「つまずく」と言っているのは、もはや言いがかりをつけたい気持ちであるだけなのではないか。
ループ
ループが面倒だというのはあって、そのあたりRubyが素晴らしい処理を行っている。JavaScriptライブラリもそれにならったものが多い。
「何を意味しているんだ」というのをつまずくと言ってしまうのならば、それは学習意欲の欠如を恥じるべきだと思うけれども。
3 part for loopは結構わかりにくいので、工夫が必要だ。
for (a = 0; a < 11; a++) {
11回ループなのだからそれほどわかりにくいこともないと思うが、別に1 originにしたいのであれば
for (a = 1; a <= 11; a++) {
とか至って構わないわけだ。もちろん、これはわかりづらいので、Rubyはこのループを排除している。
11.times do |a|
だが、この3 part forが欲しいケースは、全然違うところであったりする。まつもとさんが大嫌いなので、Rubyに入ることは絶対にないが。
for (<>; ! ~ /^END$/; <>) {
Perlになれている人以外はまるでわからないと思うが、これは、「各行を読み、それが「END」だけの行でないならばループを続ける」ということだ。
この応用として
for ( my @lines; ! ~ /^END$/; <>) { push(@lines, $_) }
というスマートなループが書けたりする。
まぁ、こんなものはお遊びだが、ループする必要性は簡単だ。日常的に、「食べ終わるまでごはんを食べるのとおかずを食べるのを繰り返す」といったループを、送っているはずなのだから。
配列
1クラス40人いたとして、出席簿を40冊用意してそれにタイトルを書きたいか?「出席簿」というタイトルで40人並べるほうが絶対楽だろう?
それだけのことだ。というか、配列なんていくら文系でも数学で習うだろう。
配列でつまずくとかわけがわからないよ。
ポインタ
確かに難易度は高いし、もっとよしなにやってくれと思うところではあるけれども、結局それが参照なのか実体なのかというのは常に問題になるのだ。
だが、これは文系がどうかには全く関係がない。文系だって「Aさんが佐藤だと思っている人物と、Bさんが鈴木だと思っている人物は、同一人物である」みたいな文章が出てくれば理解できるはずなのだから。
まとめに対して
本人も意欲のせいだということを言ってはいるが、そのあとがおかしい。
「なぜなのか?どうなっているのか?なんのために?どういう意味?」それを気にするのは理系の傾向であって文系の傾向ではないし(理系は証明する学問だ)、非常に重要な資質なのだ。
「そういうものだからで済ませる」というのは、明らかに向いていない人だ。
それは、理系だの文系だのという話ではなく、理知に対する姿勢だと思う。どうでもいいことばかりを考えて難癖つけたがるというのは、もっと単純に「意欲がないし、取り組む姿勢もない」というだけの話で、文系に対する風評被害を生じさせるのはやめていただきたい。
実際文系プログラマってどうなの
プログラミングなんて9割方文系領域なので、別に何も問題ない。
クリエイティブであるはずの料理を単純作業にできるように、世の中ではプログラマの仕事が単純作業だったりもするわけで、そこはスキルなんてほぼ不要だったりもする。やる気なんかなくても覚えたことを繰り返すだけでいいという世界もある。
優れたスキルが欲しいのだとしても、別に文系だから不利ということは特にない。理知的であれば良いのだ。
むしろ、私が持っている「記憶力」というハンデのほうがはるかに大きい。