プログラマになるためにはどうすればよいのでしょう?

きむら(K)さんち経由で。あの方は、毎度こういうおもしろそうなのを、どんなアンテナで拾い上げてくるのか、興味が尽きないところです。

プログラマになるにはどうすれば良いのでしょう?

はじめまして、プログラマになりたい中学1年生です。将来はソフトプログラマー(PCソフト系)になりたいと思います。プログラミングの知識は全くありません。経験もありません。(関係ないでしょうが、HTMLができるぐらいです)

今回質問したいのは....。

などです。

ちなみに、高校は工業高校に進学したほうが良いのでしょうか?大学はどのような学校にはいれば良いのでしょうか?やはり、C言語は覚えたほうが良いのでしょうか?

質問ばかりですいません。どなたか、詳しい方、ご回答お願いします。

プログラマになるにはどうすれば良いのでしょう? - その他([技術者向] コンピューター) 解決済み| 【OKWAVE】

というわけで、わたしなりの回答を考えてみました。

プログラマとはどのような職業なのか

システム開発はよく建築業界に喩えられますが、その場合プログラミング工程を「製造(設計図に基づき家を造っていく工程)」に準えられます。しかし、これは間違っています。プログラミング工程は製造ではなく、むしろ設計図を作図する工程に似ています。プログラマーの仕事は設計すること――しかも、最終製品に一番近い水際での設計を担当する職業、それがプログラマーです。

ただし、その水際から遠い側にどれだけの権限があるかは、業界や会社次第で、その担える範囲によりその仕事の印象は大きく変わります。

あまりに権限を剥奪される酷い環境では プログラマーはしばしば「コーダー」や「PG」と呼ばれ、写経のような作業(しかも教典が欠陥品)に従事させられています。老婆心ながら、そのような環境はとてもつまらなく、かつ人生を棒に振りがちなので、避けた方が良いでしょう。

一般に、もっとも実力をつけたプログラマー(リーダー格)の活動上限は、要件定義(仕様書)を境界としているようです(というよりもプログラマーの仕事の上端を切り分ける目印となるドキュメントを「仕様書」と呼称するケースが多いです)。

補足説明:

日本の殆どの開発現場は、ドキュメント駆動開発を行います。ある作業(この場合システム開発)を複数人で担う場合、その責任の範囲をドキュメントで区切って分担するのです。前述の場合、仕様書を境界に SE と プログラマーの線引きをする会社もあれば、「詳細設計書」を境界に SE と PGの線引きをする会社もあるという話です。

一般に、「要件定義書」「仕様書」「基本設計書」「詳細設計書」などがありますが、これらには明確な違いはありません。たとえばA社で仕様書と呼ばれていたモノが、B社の基本設計書と同等だったりします。極端な例ですと仕様書に画面の詳細設計が書いてあったりします。会社依存です。

プログラマにはどのような種類があるのか

ハッカー
プログラミングを愛し、極めしモノ達です。生きること=プログラミングすること、で、GNU/Linux に代表される「自由なソフトウェア(フリーソフトウェア)」を作っちゃうようなタイプの人達です。詳しくは How To Become A Hacker をご参照ください。ハッカーとはなにか、どうしたらハッカーになれるかが説明されています。
職業プログラマー
プログラミングを仕事の糧としてのみ行うモノ達です。私生活でプログラミングを行わないため、その能力は入った会社の技術レベルに大きく依存しますが、技術が日進月歩のこの業界では、その能力が 入社4,5年目あたりをピークに急速に衰えていくのが一般的です。よって35歳定年説が適用されるタイプのプログラマがコレです(それまでにこぞってSEになろうとします)。ちなみにハッカーに定年はありません。
本物のプログラマー
人間の生物学的な認識力の限界を超え、16進文字列を難なく読みこなし、機械とのガチの会話を愉しめる人達です。例えば、悪いプログラムの例として上げられる「スパゲティコード」ですが、これは人間が理解不可能になるので「悪い」のです。したがって、機械と本物のプログラマにとっては、スパゲティに良いも悪いもなかったりします。
ワナビー
ハッカープログラマーに成りたいな、と日夜思ったり呟いている人達です。そうしてる暇に、さっさと手を動かせば、直ぐになれるにもかかわらず、永遠に思ったり呟き続ける人達です。(わたしとか)

システムエンジニアとの違いは?

システムエンジニアとは「上流の設計」をする方達のことです。プログラミング(最下流)をしているかしていないかは直接関係在りませんが、SE, PG などとわざわざ呼びわける現場の場合、プログラムを書かず、「仕様書」「設計書」といったドキュメントを量産する立場を指すことが多いです。

注目したいのは「上流」という概念はウォーターフォール開発に特有のものである点です。ウォーターフォール開発は、お客様の要望を「水源」最終製品を「河口」と捉え、水がながれるように開発をバトンタッチしていく開発方法ですが、ぶっちゃけこのフローに従って作業を分担するときの上の方をSE、下の方をPGと呼ぶところがあるよ、というだけです。

ウォーターフォール開発は「水源」に近いほどお客様に近いと錯覚しがちですが、要求を受ける「水源」と、最終製品を渡す「河口」が一番お客様に近いです。SEはまさに中流に属しお客様から最も遠いポジションを担います*1。ここで要求されるのは「水源」と「河口」を同じモノとする努力です。それは大変難しい作業で、それには技術にもドメイン(お客様の問題領域)にも精通している必要があります。大変ですね。


(参考:顧客が本当に必要だったもの)

しかし一方で、もっともお客様から隔たれた陣が取れるのもSE で、そのためたとえ浮世離れした絵空事を吐いても「仕事」として見なされる、夢のような職業でもあります。その絵に描いた餅と現実のギャップを埋める職責はPGにあるため(権限はないけど責任はあるのです)、このような腐った SE と 心あるプログラマーは敵対関係にあったりします*2(ちなみにプログラマにも心がないと顧客が泣きます)。技術力を失った元PG が「約束の地」として SE を求めるのもさもありなんです。


仕様や設計の問題点は作ったり、作ったモノを実際に使ってみて始めて解ることが多いため、モデリング(要件を設計すること)をする人間はプログラミングも出来ないと 良いモノが作れない・・とも言われています(Domain-Driven Design の Hands on Modeler)。これはプログラマーにも言えることで よいモノを作るには、プログラマモデリングから離れるべきではありません。

Domain-Driven Design: Tackling Complexity in the Heart of Software

Domain-Driven Design: Tackling Complexity in the Heart of Software

結局良いSE は 良いプログラマーであるべきであり、良いプログラマーは良いSE で在るべきなのですが、そうならば、わざわざ SE という概念を設けること自体ナンセンスなのかもしれませんね。だから「システムエンジニア(システムに関わる何かをする技術者)」なんて、身のない言葉になってるのカモ(;-p

プログラマの平均年収・月収は

禁則事項です*3

プログラマに必要な知識・資格・心構え・道具はなにか。

資格は必要在りません。

必要な知識は、使用するコンピューターのこと、使用するプログラミング言語のこと、お客様の業務内容など多岐にわたります。なので全てをあらかじめ身につけておくことは難しいでしょう。興味があるもの、必要になったものをその時点時点で学んでください。特定の知識よりもむしろ 学びかたが上手であることが プログラマー には要求されます。

関連して心構えは、一生勉強し続けることを愉しめること、でしょうか。道具は、自由に使えるパソコンが一台以上。また、頑健な肉体を道具に決して精神は砕けないぞ!と無理難題に挑む心構えも必要です。覚悟は完了しましたか?

真面目な話をすると、英語が読めるととっても助かります。わたしは学生のころ「英語なんて使わないから勉強しなくても言いジャン」と過ごしたツケを、今もなお払い続けているところです。しくしく・・・・。

数学が苦手でも出来るか

可能です。学生時代の数学の出来・不出来はプログラマーとしてして向いているか?にはあまり関係がありません。

ゲームプログラマーとかは普通に数学とお友達らしいですけど、Web系とかでは滅多に使わなかったりします。基本的に数学は、お客様の業務内容(たとえば、行政系システムだったら法律とか)と同列と考えてよいかもです。

ちなみに、実はプログラミングを通じて数学を学んだ方がよっぽど簡単だったりします。

C言語の活用法 / C言語は覚えた方が良いのでしょうか?

お仕事での Cの使いどころは、組み込み系やコンシュマーゲームなど、ちょっと特殊な環境(コンピュータ資源がプアだとか)/分野で使われています。また、この分野も最近は C++ で開発することが多いです(余談ですが、C と C++ は全く別の言語です)。

Cは、なぜだかワナビーにとっても人気のあるプログラミング言語ですが、実際仕事している立場からすれば、使う仕事をするなら覚えれば? くらいの認識です。最初の言語として C を選ぶのは愚策です。ただし、複数覚える言語の一つとしては覚えておいた方が良いと思います。

以下は、How To Become A Hacker からの引用です。

でも、言語を一つしか知らないなら、ハッカーではないし、プログラマですらないのです。あなたはプログラミングの問題について考えるのに、ひとつの言語に依存しない一般的な方法を身につけなくてはならないからです。真のハッカーになるには、マニュアルの記述を自分のこれまでの知識と関連づけることで、新しい言語をものの数日で習得できるようにならなくてはなりません。ということはつまり、ぜんぜん違った言語をいくつか学ぶべきだということです。

本気でプログラミングをするなら、C を勉強するしかありません。これは Unix の中核となる言語です。C++ は C と密接な関係にあります。片方を知っていれば、もう片方を学ぶのはそんなにむずかしくありません。が、どっちも真っ先に勉強しようとするのには向いた代物ではありません。

How To Become A Hacker: Japanese

進学は?

ちなみに、高校は工業高校に進学したほうが良いのでしょうか?
大学はどのような学校にはいれば良いのでしょうか?

高校は何処でも構わないと思います。大学は、大学受験のときにプログラミングが出来るように成っていてそれが愉しくて仕方がなかったら、そっち系の大学にすすめばよいでしょう。

あんまり就職には関係ありませんし、そういう環境にいけば 受動的にプログラミング能力が身につくかというと、そんなこともまったくありません。


* * *


最近ブラックネタの受けが良いので、意識的に織り交ぜ。鼻についたらゴメンナサイ。質問者さん(中学生)向けの回答としては失格ですね...orz

*1:SE自身の意識は「俺はPGよりお客(=神)に近いんだ」と思っているかもしれません。SE:「俺の声は神の声!PGどもは俺の声に従え」PG:「でもこれ絶対使いにくい、というかむしろ有害ですよ」SG:「神託は俺が聞いてるんだ!お前らPG風情が神の御心を知ったつもりなんて、おもいあがりもはなはだしいんだよ!」みたいな

*2:そういうプログラマーは しばしばSEと言う単語の後ろに (笑) を付けて発音します

*3:ヒント: 一般のサラリーマンの平均より全然低いよ!