ゴミ箱の中のメモ帳

まだ見ぬ息子たちへ綴る手記

プログラマを目指す君へ

昨日「未経験なプログラマ」を書いたが、そうすると「じゃあどうすればプログラマになれるんだ」というアホみたいな質問が上がってくるかと思うのでそれも書いておく。

本来こんなことも自分で考えられないようならそもそもに諦めたほうがいいが、今学生諸氏や若い人間向けに書いておく。

いろいろな人の考えがあると思うが、これは私の経験と、私が過去にプログラマを目指している人たちに教え、その通りにした人たちは実際にプログラマとして働いていると言う経験だ。一つの方法として考えて欲しい。要はとにかく勉強し、行動することが大事だということだ。


まずプログラマを目指すと考えると専門学校や情報系の大学に進もうと考えるかと思うが、「地方の専門学校とか大学の情報科とか行く意味はない むしろ邪魔」や「アホで間抜けな専門学生(卒業生)からのご意見に付きまして」のように、プログラマになるために専門学校なんかに行く必要はない。

例えば「スクエア・エニックスに何がなんでも入りたい」という希望があればスクエア・エニックスが出資している専門学校に入る意味は低くはないが、先の記事のようにそれほどお勧めできることではない。そして大学にも同じ理由でプログラマを目指すだけで行くものでもない。教養を身につけるためであっても、プログラマを目指すのに若いに越したことはないので「プログラマを目指すため」であれば基本的に必要はない。


これは「今から」プログラマを目指す人の為の記事になる。今までに勉強してきたもののダメであった人たちはそのことを忘れ、「知識が発想や学びの邪魔をする」のように全ての知識を捨てて、この記事に沿って勉強して欲しい。

ブログを作る

まずプログラミングの勉強を始めようと思った今この瞬間にブログを作る。この「ブログを作る」と言うのが軽視されがちだが非常に重要になる。

あなた以外はあなたがプログラミングを勉強していることも、どのように勉強しているのかも、どのように成長しているのかも、どの程度コードが書けるのかも知ることは出来ない。だからブログを使い世間に自分の能力を公表していくのだ。

ここで恥ずかしいと思ってはいけない。あなたは今からプログラミングを始めるのだから、今出来ないのは当たり前だ。それを恥ずかしいと思うようではプログラミングは出来ない。プログラミングをしていると常に新しい技術や新しい分野のコードを書かなければならない。それに抵抗を持ってはいけない。

とにかく勉強したらそれを公開する。「varは変数の宣言をする」のような勉強した内容を書くのではなく、その日の発見や感想でもいい。最初は技術的な発見や、勉強に準じたコードは書けないだろう。だがそれでもいい。とにかく毎日書くことだ。

プログラマ募集の応募欄には成果物や自分のWebサイト、GitHubのアカウント名を求められることがあるが、そこに堂々とブログのURLを書けばいい。私はこの期間でこのようにプログラミングを学びました。このような勉強をし、この知識を持っています。と履歴書には載らない経験をブログが語ってくれる。

後になるが、コードを書く時や読んだ時の感想、コミュニティ活動の履歴なども書けばあなたの能力や活動状況が一目でわかるようになる素晴らしいブログになる。

HTMLとCSSを勉強する

まず、今の業界でHTMLやCSSを使わないところはない。組み込みでもゲーム制作でも最近はインターネット接続が当たり前になっているため、HTMLとCSSは最低限の知識だ。実際に仕事で使わなくてもドキュメントの制作やマニュアルの作成など、多種多様な場面で使うことになる。

ここでのHTMLやCSSの勉強の仕方は「HTMLやCSSなんて1週間もあれば覚えられるだろ」に書いてある。完璧にHTMLやCSSを覚えようとするのではなく、自分が使えるようになるまで覚える。今後も並行して勉強を続ければいいので、例えばこのブログのデザインを再現できる程度であれば問題ない。

そして、この自分のHTMLとCSSの知識レベルを表すためにブログのテンプレートを自分で作ることだ。結局知識は使わなければ確認できない。実際に作ってみてわからないところがあれば勉強する。その繰り返しだ。この先の勉強を進めるにつれ、コードのシンタックスハイライトをしたいと思えば、必要になる度にどんどんと機能を追加していけばいい。

勉強したらそこで終わりではなく、そこからが始まりで終わりはない。

プログラムは作り始めたら完成することはなく、次のリリースへの始まりでしか無い。

プログラミングを勉強する

HTMLとCSSが書けるようになれば次にプログラミングを勉強する。HTMLとCSSは「どの業界でも使うから」と書いたが、実際には他の理由もある。例えばプログラミングを始めれば色々な設定やデータベースとしてマークアップ言語を使う機会がある。そのマークアップ言語の使い方を知っておくことだ。マークアプ言語は基本的に同じようなものだ。HTMLが理解できていればXMLに迷うこともない。

プログラミング言語は別に何でもいい。悩まずにとにかく勉強することだ。人によってはPHPRubyPython等と名指しで勉強を進める人もいるがどれでもいい。基本的にプログラミング言語の目的はどれも同じだ。問題を解決するアルゴリズムを言語によって表現することだ。

一つのプログラミング言語を理解して使えるようになれば、他のプログラミング言語も容易に理解できる。とにかく一つの言語でプログラミングが出来るようになることが重要だ。それがLLであれ、C言語であれ、C#であれ、Rであれ、Lispであれ同じだ。言語によって考え方の違い、目的の違いはあるが根本的には変わらない。

最もたちが悪いのは、自分が使えるプログラミング言語を増やそうと広く浅く勉強することだ。こんなことなんの意味も無い。就職すればどの言語を使うか、どのライブラリを使うか、どの環境を使うかは会社によって変わる。例えば会社が独自言語を使っているかもしれないし、独自フレームワークを使っているかもしれない。Emacsは禁止されVimに改宗を迫られるかもしれない。その変更が出来るベースの知識を持っておくことが大事だ。

ただし、プログラミング言語は目的や考え方の違いから全く異なるアプローチであることもある。そのアプローチによって自分の手に馴染むかどうかは変わる。例えば私は15年ほど前にPerlを勉強したが苦痛であった。省略がわけがわからず、$$$やリファレンスのリファレンスのリファレンスのように考えると無限地獄に陥るような苦痛であった。だがPythonを始めると変数は全てオブジェクトへのリファレンスというシンプルな考え方からすんなり理解でき手に馴染むことが出来た。

このように人によって手に馴染む言語というのがあるが、それを見つけるのは一つの言語の基本構文を覚えてからだ。基本構文を覚え、ある程度のコードが書けるようになってからいくつかの言語を試してみればいい。そしてその中で手に馴染むものがあればそれを勉強すればいい。

プログラミングの勉強をする時に「○○言語を勉強したほうがいい」と言ってくる人間がいれば今後近づかないほうがいい。その人がプログラミングの勉強をサポートしてくれるのならばまだしも、そのような場合は単にその人がその言語しか使えないくらいの理由だ。

だがしかし、最初からRやClojureを勉強するのは少々難儀するかもしれない。まずは書店で参考書の多い、C言語C#PHPPerlPython,RubyJavaのような言語から勉強を始めたらいい。参考書が多いということは情報が多く、勉強を進めやすい。

コードを書く

プログラミングの勉強を初めて陥るのが、「何を作ればいいかわからない」、「作ろうと思っても作リ方がわからない」という悩みだ。これは多分、最近プログラミングの勉強をするすべての人間が陥ることだ。

確かに「Hello, World」と基本構文を覚えても何か作れる気はしない。だがそれは「入門書」でプログラミングを勉強したからであって、今あなたが使っているパソコンのOSやソフトウェア、インターネットのサービス、携帯電話は全て何らかのプログラミング言語で書かれている。あなたが勉強した言語で何らかのシステムが作られ動かされているのだ。

これをベースに考え、LLであればまずは掲示板やチャット、C#Java等のデスクトップアプリケーションが作れるものであれば電卓やテキストエディタ、画像ビューア、とにかく自分が普段使っているものを作ってみる。機能には縛られなくていい。とにかく作ることが大事だ。

ここで「そんなもの作っても意味がないから」と作らない人がいるが、そんなことをしていては何も作ることは出来ない。FacebookであれTwitterであれ、Googleであれニコニコ動画であれ、全ては掲示板やチャットなどの延長線だ。掲示板が作れなければTwitterも作れない。

とにかく自分が勉強した中で作ることが大事だ。

コードを読む

そして、人が書いたコードが読むことだ。プログラミングを覚えて失敗する人は、大抵人の書いたコードを読まない。自分の知識の中だけでプログラミングをしようとする。これは愚行だ。

結局人は自分の知識の中でしか創造することが出来ない。先の掲示板を作っているとしても、入門書の知識の中からそれを継ぎ接ぎして作るだろう。だがそれは結局進歩はない。自分の知識の中でいくら作ってもそれは「創造」ではなく「変形」でしかない。

だが人が書いたコードを読むことで自分の知らなかった用法や書き方を学ぶ。知らなかったライブラリやアプローチを知る。一つのことをするのでも十人十色、皆やり方が違う。それを知ることで、自分の知識に邪魔をされず新しく知識をつけることが出来る。

例えば文章を書こうと思っても、「乖離」と言う単語を知らなければその単語を使うことは出来ない。例えそれが適切な単語であったとしても、それを知らないことでそれが使えないのだ。言い回しや適切な例えが他にあるかもしれない。これらは人の書いた文章を読むことで勉強できる。小説家が多量の本を読むのはそのためだ。知識を増やし、創造領域を増やすのだ。

はじめは人のコードを読んでも分けがわからないかもしれない。だが、わからなくてもいいから読む習慣をつけることだ。最初は1行しかわからなくても次に2行わかるようになればいい。それを繰り返すことで全てを理解できるようになる。

コードを書く

コードを読めばそれを使って新しいコードを書く。例えばオブジェクトのシングルトンを知ればそれを利用したコードを書いてみる。インターネットからファイルのダウンロード方法を知ればダウンローダを作ってもいい。そうやって新しい技術を身につけていく。

掲示板を作る中でフレームワークが使われていればそれを使ってもいい。とにかく自分の知識の中で泳ごうとせずに新しい知識に飛び込んで行くことが大事だ。

コミュニティに参加する

これは本当なら「コードを読む」の時点から並列に行って欲しいのだが、並行した文章を書くことが出来ないのでこの位地になった。本来なら平行にするということを肝に銘じて欲しい。

今現在はコミュニティ(プログラマの集まり、特定のソフトウェアの開発を目的としたグループ)は多く公開されており、それに参加することは簡単だ。例えばWebならWordPress等のブログエンジンからフレームワークApache等のエンジン等、多種多様なコミュニティが存在する。例えばあなたが勉強したプログラミング言語がLLであれば、大抵はこのコミュニティにより開発されている。

そのどれかに参加するということが大事だ。参加するのに難しいことはない。「使う」ことでも参加できる。

これは非常に重要になる。今までの勉強は全てこのコミュニティに参加するためにしてきたと言っても過言ではない。私がプログラミングを教える際はこの「コミュニティ参加」を目的とし、そのコミュニティに参加するための知識を教えこむ。

そして、未経験のプログラマが就職するために必要なのもこのコミュニティへの参加だ。先にも書いたが、未経験プログラマは結局何が出来るかわからない。ポートフォリオに成果物があったとしても、それをあなたがどのように作り、どのように設計したのかなんてわからない。

だがこのコミュニティに参加することであなたの貢献は保存され公開される。あなたがどのようなコードを書き、それがどのような目的を持っているか、どのような品質であるのかということはそれだけでわかるのだ。

さらに例えばWordPressのコミュニティに参加したとする。そして、就職する企業がWordPressを使っていたとすると「その機能、私が作りました」と言うような話もできるし、コミュニティに参加することで得た対象への深い知識もその場で証明することが出来る。

また、先の記事にも書いていた「経験者のみ」や「経験1年以上」と書かれているような求人も、このコミュニティでの参加経験も考慮される。これは企業によるかもしれないが、結局それは先に書いたように「プログラミング未経験」を弾く目的でしか無いため、コミュニティの参加経験は歓迎される。

特にコミュニティへの参加は「金のため」ではなく、能動的に自分から参加するものなのでその点も「1年で辞めたプログラマ」よりも考慮される(少なくとも私は)。

このようにコミュニティへの参加はいいこと尽くめだ。このような需要のあるコミュニティへの参加は難しいと思うかもしれないが、そんなことはない敷居は低い。そして、コミュニティもあなたの参加を待ち望んでいる。

とにかく使う

もちろん、プログラミングの勉強を始めたあなたがいきなりプログラムの修正やコミットを行えるわけはない。まずはその対象への理解を深めることが大事だ。

その理解を深めるにしてもコミュニティ規模が大きくなればなるほど大きなコードになるためプログラムを読む難易度も高い。

だが最初にすることはとにかくそのプログラムを使うことだ。使ったことのないプログラムのソースコードを読んでも理解は難しい。だが、使い方を熟知しているプログラムなら機能を想像しながらコードを追うことができるので理解も早い。

よってまず始めることはそのコミュニティのプログラムを使うことだ。細部まで使ってみることだ。使ってみることで不便な点や不具合を発見できる。それを発見できれば次のステップに繋げることが出来る。

逆に自分が普段使わないプログラムのコミュニティへは参加しづらい。コミュニティへは「より良いものにしたい」と言う人たちが集まっているので表面的な付き合いならすぐにわかってしまう。そして自分が使わないプログラムの修正などやる気も起きない。自分が使っているものであれば便利になることは歓迎できるはずだ。

よって自分が普段使っているもの、または便利だと思っているもののコミュニティに参加することだ。そして、できれば小さめのプログラムのコミュニティに参加することだ。いきなりApacheコミュニティに参加しても自分ができることは少ない。だが、小さめのプログラムなら勉強をつづけるなかで全体構造を把握することも難しくない。

ブログに使い方や豆知識を公開してもいい。コミュニティはユーザを増やすことを期待しているので、その記事からユーザが増えることは喜ばれることだ。そして、そのブログ記事で問題が解決できればコミュニティへの質問も減る。自分は微々たることだと思ってもその効果は大きい。

質問に答える

コミュニティのMLやサポートはユーザの質問であふれている。コードについての質問もあれば、「○○をするにはどうしたらいいか」、「○○はどう使うのか」のような、「使い方」の質問も多々ある。

あなたは細部までそれを使っているのだから、簡単な質問になら答えることが出来るはずだ。コミュニティのプログラムを書ける人たちの手をわずらわせること無くそれを解決するために、あなたが率先して質問に答えればいい。コミュニティにとってそれは非常に助かることだ。

質問に答えなければ「あのソフトはバグだらけ」や「聞いても答えてくれないから使わないほうがいい」というバカな風評を流す人たちもいる。そんな人たちに使ってもらう必要はないのだが、風評は避けるべき事柄であるのであなたがサポートしてくれることは非常に助かる。

その実績がたまれば、サポートBBSやMLの管理権限を一部貰える場合もある。そうしてとにかく実績を重ねていくのだ。

バグ報告をする

使えば不具合や不便を実感できる。マニュアルの誤りでもいい。とにかくそれを報告する。不具合であれば堂々と報告できるが、不便は報告しづらいかもしれない。なので、提案という形でどうすれば便利になるかを考えた上で投稿する。

もちろんそれは過去に却下されたものなのかもしれないので過去のMLなどは探っておく。提案は却下される可能性ももちろんあるが、それが便利なものであれば歓迎される。

バグ特定に参加する

自分がバグを見つけられなくても、他の方がバグを見つけているかもしれない。だが、往々にしてその問題は原因が特定されているわけではなく「再現条件がわからない」と言うものになる。

なのでその不具合が起きる条件を探す。再現条件が非常に難しい場合もあるが、報告者の環境がわからなければその再現条件を質問するなど、わかる人たちが不具合を特定するための手助けも出来る。

そうして、不具合の特定を続けることでプログラムの構造も理解できていくはずだ。普段使わない機能についても組み合わせのバグが新たに見つかるかもしれない。

とにかく「これはわからない」と諦めるのではなく、そのわからない一歩前まで歩みを進めることが大事だ。機能のバグであればその機能に関連するソースコードを追ってみる。とにかく解決方法を探るのだ。

バグ修正をする

そしてあなたはプログラミングの勉強をしているのだから、不具合を解決できる立場にある。先の「バグ特定に参加する」のようにコードを読んでいればどんどんとそのプログラムの設計やコードについて理解が深まっていくはずだ。

いきなりコア機能に関するバグ修正は難しいかもしれないが、簡単な不具合なら治せるはずだ。そのバグを修正して、自分なりに動作を確認してみる。そうしていけば、人の書いたコードを読む能力や、それを修正する能力、コードを書く能力が鍛えられていく。

自分で修正したバグでなくても、人が修正したバグから、そのコードで他の問題が起こらないことを確認してもいい。これは非常に重要な作業だ。

パッチを送る

バグ修正を何度か経験すれば、コミュニティ宛にパッチを送ってみる。私の経験から変なパッチを送るとフルボッコにされることもあるが、それを恐れてはいけない。フルボッコにされるということは、そのパッチを読んでくれているということだ。端からダメだと思われるパッチであれば無視されるか、端的に受け入れられないという返事だけが送られてくる。

このフルボッコが怖ければ、それまでにコミュニティで世話になった人個人宛てに「こんなのどうでしょう」的なメールで意見を求めてもいい。そうして自分のコードを洗練させていけば直接パッチを送れるほどの技術も身についてく。

そして、あなたが何度もパッチを送ることであなたの信頼は上がっていき、実績も増えていく。

バグ修正をする

パッチを何度も送っていけば、あなたはコミュニティ内である程度の地位があるはずだ。そうすれば、その信頼からコミット権限や「○○担当」のような肩書を貰えるかもしれない。これにはある程度の期間や実績がいるかもしれないが、あなたの貢献度に応じてある程度の権限は貰えるだろう。

なんか果物的なクソコミュニティの様に私も痛い目を見たこともある。かなりクローズドで、「私に直接あって飯を食っていない奴はコードに指一本触れさせない」というクソみたいな奴もいるがそれは極わずかだ。

そして地位を貰えばそれに応じて責任も重くなり、「このバグはあなたが対応して」といったような振り分け方をされるようになる。だがこれもいい経験だ。「自分がわかること」だけ対応するのではなく「わからないこと」に対応していくチャンスだ。実際の仕事ではそういった振り分け方をされる。

そして、そうすることで今まで使っていなかった機能や技術をつかって問題解決をすることであなたの知識も深まっていく。

ここまで行けばあなたはかなりの知識を蓄えているはずだ。先の記事にも書いたが、専門学校や大学を卒業してもパッチの一つも書いたことのない人間など腐るほどいる。あなたはそこ集団から飛び抜けた知識と経験を得ているのだ。

そしてその経験は企業にとっても歓迎すべきもので、これらの活動から企業の方からも声をかけてもらえるかもしれない。


私はこのようにプログラミングを勉強し、このような流れでプログラマを養成してきた。結局、いくらプログラミングを「勉強」しても、勉強になど意味がない。それが使えて、それを使った経験が重要なのだ。そしてその経験があなたの自信へとつながっていくはずだ。


あなたがプログラマになることを期待する。


小学生からはじめるわくわくプログラミング

小学生からはじめるわくわくプログラミング

入門ゲームプログラミング (Professional Game Developerシリーズ)

入門ゲームプログラミング (Professional Game Developerシリーズ)

コンピュータープログラミング入門以前

コンピュータープログラミング入門以前

Cプログラミング入門以前

Cプログラミング入門以前