Diary Blog of Dary

temtanが書いた文章

id:temtan がちょっくら本気だして初心者用プログラミング言語は何かについて考えてみた

初心者と言っても色々な人が居ます

今までの「初心者用プログラミング言語は何か」について書かれたエントリなどを見て思った事は、「初心者とはどんな人か」についてちゃんと書かれていたのは殆ど無かったと感じていたんですよ(そーゆーの有った?)。一言で「初心者」と言っても、「四月に大学の情報学部に入学した人」や「普通の OL さんがちょっとカッコイイから」とか「今まで文系だったけど SE に就職したから」や「金のネタになりそうだから」とか色々人が居るわじゃないですか。
例えば「最終的に到達したいレベル」や「モチベーションの維持力」とかそもそも「やりたい事」などが違うわけでして、その人らを一緒くたにして「初心者」と括って語っても、どうしてもおかしな部分が出てくるでしょう。

初心者を分類してそれぞれに対して考える

まず、「初心者」というのを二つの軸を使って四つに分類します。軸は以下の二つで

  • 最終的に行きたい(行くであろう)レベルがスペシャリストかどうか
  • 目標とする具体的なヴィジョンを持っているか

前者は、端的に言うと「プロ」と「非プロ」と言っても良いかもしれないのですが、「プロ」と言うとこの業界はプロと言ってもたいした技術を持っていないのにプロという人が沢山いるので、スペシャリストと区別して言います。イメージ的には自分でサービスを立ち上げるなり、顧客を持ってシステムを構築するなどが出来る人を想定します。
後者は、その時現在の目標とするものを持っているかどうかで、例えば「いつかは Matz さんのように言語制作者になるんだ」とか「面白い Web サービスを作りたい」とか「今の事務作業をテキパキこなしたい」といった具体的なもの。「SE になりたい」程度は具体的ヴィジョンとは呼びません。

上記の軸で初心者を分類した表が以下。

スペシャリスト 普通
具体的ヴィジョン有 A タイプ B タイプ
具体的ヴィジョン無 C タイプ D タイプ

上記のように初心者を A B C D と分類してそれぞれの特徴と、重視すべき点を踏まえ、それらの人に向いているプログラミング言語について語って見ます。

  • A タイプ ( 最終的にスペシャリストを目指し、具体的ヴィジョンを持っている)

結論:「まずは具体的ヴィジョンに合わせた言語で良いが、ただし、最終的に C 言語は避けて通れない」

このタイプの人(で、かつ初心者って人)は少ないですが、後述する C タイプの人が具体的ヴィジョンを持ってこのタイプになることもあります(けど、それってもう初心者じゃないかも)。このタイプについて考えると、まずは具体的ヴィジョンを持っており、当然それへのモチベーションは高いのでその具体的ヴィジョンに合わせた言語を学べば良いでしょう。
しかし、スペシャリストを目指すからには自分がやる仕事に関しては全責任を負ってサポートできる必要があると思います。例えば、現在でサービスを立ち上げるとすると、ある OS 上のある言語処理系で構築されたサービスになると思います。その際に何かしら問題が起きた時、その問題が自作のプログラムの問題なのか、 OS の問題なのか言語処理系の問題なのか切り分けられないとマズイですし、さらにはその問題を解決できないとスペシャリストとは呼べないでしょう。その際に OS と言語処理系の知識は必須となりますが、現在の OS や言語処理系を理解するには C 言語はまず必須となるでしょう。 OS のシステムコールは大抵 C 言語インタフェースが用意されてますし、言語処理系も C 言語で作られているのが多いと思います(この辺ちょっと自信なし)。また、言語処理系でも一部を C 言語で書いたモジュールを読み込めるようになっている言語もあり、ある言語の機能を十分に把握するには C 言語が必要になる場合もあります。他にも色々と理由はありますが、コンピュータのスペシャリストを目指すからには C 言語は避けて通るのはまず無理だと感じています。
よって、結論は、「まずは具体的ヴィジョンに合わせた言語で良いが、ただし、最終的に C 言語は避けて通れない」と思います。

  • B タイプ ( 最終的にスペシャリストは目指さないが、具体的ビジョンを持っている )

結論:「自分がやりたい事(なりたい自分)をしっかりと明確にし、それを実現出来るプログラム言語をちゃんと調べた言語が良い」

このタイプの人は「○○さんカッコイイ!私もプログラマになりたい」とか「まあ面白い Web サービスをさくっと作ってみたいなー」とかそんな感じでやりたい方向性は決まっているものの、それほど入れ込んでいない人。
この手の人達に重要なのは、「モチベーションの維持」。それほど高い目標を持っていないので、ちょっと難しい事があった場合、本来なら放棄する程の事でも無いのに放棄してしまう可能性が高いと踏んでいます。
なので、この手の人達はモチベーションを維持できるプログラム言語が良いと考え、やはり具体的ヴィジョンに合わせたプログラム言語が良いでしょう。ただし、重要なのが、「自分がやりたい事(なりたい自分、要するに具体的ヴィジョン)が何かをハッキリとさせ、このプログラム言語を習得すればそれが出来る(なれる)事をちゃんと調べること」がモチベーションの維持に必要でしょう。ここがブレるようでな何をやっても結局長続きしません。
よって結論は、「自分がやりたい事(なりたい自分)をしっかりと明確にし、それを実現出来るプログラム言語をちゃんと調べた言語が良い」が良いと思います。

  • C タイプ ( 最終的にスペシャリストを目指すが、具体的ヴィジョンは持っていない )

結論:「まずは基礎となる C 言語を学び、いつか具体的ヴィジョンを持ち前述の A のタイプとなるのを目指す」

このタイプの人は「大学の情報学部に入学したばかりの人」とか「これからはコンピュータで飯を食っていこう」とか、目標は高い(の筈)ものの、ハッキリとした具体像はまだ見えていない人。
この手の人達はモチベーションは高い筈で、ちょっとやそっとで無くなるようなモチベーションだったら、正直コンピュータのスペシャリストには向いてないです。という訳で特にモチベーションの維持は考えない方向とします。
それで必要だと思ったのが、いつか具体的なヴィジョンを持った時に勉強した事が役に立ちやすい、またはコンピュータのスペシャリストとしての基礎を勉強することが出来るものが良いと考え、その役割に適しているのあは C 言語だと判断しました。
現在で実用となっている言語の多くは C 言語(ALGOL 系言語)を元に、それから大きくは外れない感じの文法となっており、また関数を始めした多くの機能は他の言語でもほぼ同じ機能があるので学んだ事は無駄にはならないでしょう。また、 C 言語は現在のコンピュータのアーキテクチャに向いている言語ですし、 OS のシステムコールなども C 言語のインターフェイスなので、コンピュータについて幅広く基礎を作る事が出来ます。そうやってコンピュータについて広く勉強し、見聞を広めることで自分のやりたい具体的ヴィジョンを探すというのが良いでしょう。
よって、結論は「まずは基礎となる C 言語を学び、いつか具体的ヴィジョンを持ち前述の A のタイプとなるのを目指す」と思います。

  • D タイプ ( 最終的にスペシャリストを目指さず、具体的ヴィジョンも持っていない )

結論:「とりあえず面白そうなのに飛びつき、飽きたら次、次へ行って自分に合いそうなのを探す」

このタイプの人は、ぶっちゃけ「ホントにプログラミングしたいんか?」と思ってしましますが、ただ漠然と「プログラマがカッコイイ」とか思っている人とかを想定します。
この手の人達はモチベーションを維持する力が弱いので、まずは B か C のタイプ(大半は B かな)になるのを目標とするのが妥当でしょう。その為にはまず、なにはともあれ楽して楽しむのが重要なのだと判断しました。とりあえず、ぱっと目に付いた面白そうなプログラミング言語や、それに限らずコンピュータ業界の話を読んでみたり、業界人のブログを読んでみたり、色々やってみるのがよいのでは無いでしょうかね。面白そうなら飛びついて飽きたら次の面白そうなのを探すと。それで、色々やっていれば自分に向いている言語とか、魅力的な目標とするような人に出会ったりするでしょう。結局何も定着しないのなら向いていなかったのでしょうから、それはもうしょうがないでしょう。
よって、結論は「とりあえず面白そうなのに飛びつき、飽きたら次、次へ行って自分に合いそうなのを探す」と思います。