Hatena::Groupbugrammer

蟲!虫!蟲!

Esehara Profile Site (by Heroku) / Github / bookable.jp (My Service)
過去の記事一覧はこちら

なにかあったら「えせはら あっと Gmail」まで送って頂ければ幸いです。
株式会社マリーチでは、Pythonやdjango、また自然言語処理を使ったお仕事を探しています

 | 

2011-09-18

[]趣味で始めるプログラミング入門未満 03:37

そもそもなぜプログラミングが趣味なのか

趣旨

 とりあえず、自分がプログラムミングをやったりする理由を考えてみる。

経歴

 自分がプログラミング言語に始めて触れたのは、確かBasicだったと思う。親がVisual Basicを買ってきたのがきっかけだった。これを使えばWindowsアプリケーションが作れる!!と思ったものだ。

 俺はゲームが好きだったので、「これで何かゲームを作れないか?」ということで色々といじっていた。そして、ゲームを作りはじめるたびに投げ出したりしていた。そのあと、インターネットで掲示板を閲覧していたさいに、色々と機能を追加したりしたくなった。当時は、CGIといえばPerl一択だったので、どうやらPerlを勉強しなきゃいけないということで、Perlをシコシコと書いていたりしてた。その後、なんだかんだあってRubyなりPythonなりJavascriptなりをやりはじめた。それくらいのスキルだ。

何かを表現するためのプログラミング

 例えば、音楽には音楽の領域があるように、絵画には絵画の領域があるように、そして文章には文章の領域があるように、プログラミングにでしか出来ない表現というのもあるだろう。それを具体的に述べることは難しいし、果たしてその表現自体が他の領域で表現できないのかどうかも怪しいが、しかし、プログラミングではないと出来ないこともある。自分の場合は、「こういうのを作るんだったら、プログラミングを勉強する必要があるな」ということがきっかけになったりした。

始めに

 いきなりだけど、「それって、そもそもプログラムする必要があるの?」という話。

「できること」と「かけること」は違う

 元々、自分が『○○で覚えるプログラミング』という本を読んだことが無い。その理由は単純で、まず本を買うお金が無かったということが一つと、そういう本は大抵退屈だったというのが一つ。

 恐らく、プログラムをやり始めるきっかけというのは、「こういうのが作りたいから」というのが理由でもあるんだが、多くのプログラム書籍は、その言語の概要を説明している。例えば手元にある『独習Java』があるのだが、章立ては「Javaの基礎」、「クラスとメソッド」、「Java制御ステートメントの概要」というのがあるのだが、プログラムをしたことがある人ならまだしも、プログラム初心者は何を言っているのかさっぱりわからない(少なくとも八年前の俺ならちんぷんかんぷんだ)。『プログラミングPHP』なら「PHPについて」「PHP言語の基礎」「関数」「文字列」という章立てになっている。で、「何ができるのかさっぱりわからねえよ!」って放り投げることが多かった。

 過去の経験を振り返るに、そういう書籍がその章立てになっているのは、その言語が一通り書けるようになることというのが目的になっているように思える。だから、他の言語を知っていると「そういうことなのね!」と理解が早いのだけども、じゃあ「それで何ができるの?」って言う部分で、困ったりもする。案外、コンソールで「1から10」が流れるだけで楽しかったりするわけで、そもそもそういう感性がない人にはプログラムをする必要もない気もする。

「できること」のための選択肢は色々ある

 というわけで、そもそも「何がしたいの?」という話でもある。

 プログラミング言語によって、そのできることは違ったりする。例えばJavascriptなら、最近だとサーバーサイドプログラムAndroidiOSを作れるTitaniumもあるけれど、やはりブラウザ上での操作に対して力を発揮するし、またPHPならその歴史上「Personal Home Page」が由来になり、正式名称が「PHP: Hypertext Preprocessor」で動的なWebサイトを作ることに長けていると言うことができる。またWindowsならHSPというのもある。とにかく「こういうプログラムが書きたいな」と思ったら、それにあった言語を探してみるといいかもしれない。例えば画像をいろいろと動かしてみたいなーと思うなら「Proccesing」という言語もあるし。(Processingは元がJavaだけれども)

 さらにいえば、言語ではないが、「RPGツクール」なんかをやってみてもいい。

 「RPGツクール」をプログラミングに入れるのはおかしいかもしれないけど、実際にRPGツクールでゲームを作ってみると、お互いの村人同士がどのように動いているのか、またイベントはどのように管理するべきなのかが参考になる。例えば宝物が開いている状態を維持するためにはフラグを立てる必要があったりするのだが、そのような「フラグ」というのを管理する必要があるのだな、その管理のためには「変数」を使う必要があるのだな(変数を理解出来ればまず一歩だ!!)というのが分かって参考になる。あるいは、最近で言うならアドベンチャー用のスクリプト言語もある。例えば「Nscript」とか「吉里吉里」とか。フリーのゲームツールはたくさんあるので調べてみるのはいいかもしれない。

 そういうことを考えていくと、いわゆるエンジニアの人が思う「プログラミング言語」にこだわる必要がないことになる。「こういう風に動かしていけばいいんだ」ということがわかれば、何であれ、他の言語に対しての参考にもなる(と思う)。何はともあれ、どんなものでも形になると楽しいので、「これがプログラミングだ!」と肩肘をはらなくてもいいとは思う。

「できること」のための拡張は色々ある

 でも、それでも多くのことはだいたいの言語で出来たりする。例えば、ゲームを作るという場合でも、どんな言語を選んでもいい。

 ただ、そのゲームエンジンを一から作るのは無謀だ。少なくとも画像を扱うだけでも膨大なノウハウが存在する。そのノウハウを一から勉強したいならまだしも、それに興味ないひとはすっとばして、とりあえず「その言語で何かを実現するためにはどんなものを使えばいいんだろう」ということを調べる。そして、それを素直に使う。例えば、「なんかサイトを格好良く表示したいなー」というならjQueryを使っておけばいいだろうし、ゲームで画像をガンガン表示させたいなーと思うなら「OpenGL」で調べてみればいいだろう。

言語の選び方

友達にきける言語

 まず最初に、言語の選び方としては、一番いいのは知り合いにプログラマーがいるなら、その人に聞ける言語がいいとは思う。でも人間の教えかたの得意不得意もあるので、とりあえずは「○○という言語を勉強したいんだけど」という話をふってみて、その話を聞いてみるといいかもしれない。

読んでいて楽しい言語

 あとはGoogle検索で色々とひっかかりやすい言語を選ぶというのも一つの手ではある。ただ、言語にもその解説の質みたいなものは違うので、いきなり「ここの挙動はこういう風になってこの挙動になっているので」ということを解説し始めるのであったり、「なんかよくわからないけどコピペすると動きますよー」みたいないい加減なものまで様々ある。Javascriptだと後者みたいなサイトが多い。

 とりあえずはGoogleで検索してみて「こういう言語だったら検索してもわかるページが出てくるから勉強しやすそうだな」という選び方をしてもいい。あと、プログラム入門書にも色々とクセがあるので(その典型例はオライリーの『初めてのPerl』だ)、読んでいて楽しい入門書を選ぶというのも必要だろう。とはいえ、そういう入門書に限って間違ったことを言っていたりする可能性もあるんだけど。

プログラムの書き方

対話型で書く

 「対話型」というのは難しいけど、要するに「何か一行で構文を書いたら、その評価をすぐに返してくれるような環境」というのがいいと思う。その理由は単純で、一行ずつ、プログラム挙動を理解することが簡単になるからだ。理解するのが簡単とはどういうことかと言えば、プログラムで「これってどういう意味なのかな」ということを試したり理解することがストレスなくできる。「ストレスなく」ってどういうこと?と思うならば、プログラム書いて、コンパイルして……を繰り返してみるといいだろう。Pythonの対話型で勉強するようになってから、いちいち書いて > コンパイルするのがちょっと大変になったりした。

 今の言語なら、たいていは「対話型」の何かしらの機能があると思うので検索してみるといい。

入門書は辞書だ

 入門書は辞書のように使う。わからないことがあったら、入門書の一番後ろのIndexを使って「これはこういう機能なのか」ということを理解する。あるいは目次で引く。

 何かわからない機能があるなら、入門書の目次なりIndexを見る。エラーが出たなら、そのエラーメッセージを見て、入門書を調べてみる。多分、一番難しいのはエラーメッセージを理解することなんだけど、初心者が簡単に複雑な挙動を実現できるわけがなく、大抵は先陣たちが地雷を踏んでいる可能性がある。メジャーな言語になればなるほどそうなので、エラーが出たら検索をする。そして、その意味がわからないなら、入門書で「こういうことなのか」と思ったりする。もちろん、エラーが出ず、自分が思っているような挙動が出ないこともたくさんあるが。

構造化プログラミングで書く

 現在はオブジェクト指向プログラミングが流行っている。ただいきなり理解しようとする必要ないと思う。

 まずは構造化プログラミングから始めてみればいい気がする。

 なぜ構造化プログラミングから始めてみるのか。

 それは、プログラミングの歴史として、オブジェクト指向が生まれる前に構造化プログラミングが先に来るからだ。

 構造化プログラミングというのは、基本的に「入力と出力が一つであるならば、プログラムが記述された順番に実行し、分岐と循環を繰り返せば、だいたいのプログラミングが出来る」という発想だ。で、多くのプログラム言語はこの記述が出来る(分岐 = if,循環 = for)。細かいことを言うと関数型言語は多少この辺りが複雑になるけれども。

 逆にオブジェクト指向でガリガリな人は構造化のほうが書きにくいというのもあるけど、最初に構造化で書くメリットは一つであって、要するに覚えることが少ないということだ。

 自分は中学生のころ、パソコン部に所属していたのだけれども、「どこへ行きますか? 1:街 2:山」みたいにどんどん分岐していくアドベンチャーを作っていた記憶がある。そういう単純なものでも作っていて楽しいものだと思う。

オブジェクト指向を一から理解せず、とりあえず「関数」とは「何かしらの入力に対して出力を返す」ということを覚えておく

 とはいえ、構造化プログラミングだけだとやることは限られている。そこで、何かしらの機能をまとめて、入力に対して出力を返す「関数」というのが存在する。例えばPHPなら関数地獄とよばれるほど関数が用意されている。もちろん、それを全部覚える必要はない。でも、自分が欲しい機能があって、一からプログラムするよりも、誰かが用意してくれたものを使えば、簡単にできたりもする。

最後に

恐れずに書いて挫折しよう

 自分が思ったことを以上に書いてみた。

 で、一番大切な事は「恐れずに書くこと」、そして「挫折すること」だ。

 自分の若いときもそうなんだけど、大抵は「こういうのを作りたい」というときに「能力以上のもの」を作りがちで、そのたびに挫折することが多い。しかし、それは大切な経験だと思う。というのも、その原因というのは、どういうものが自分にとって作れる大きさのものなのか、ということがわからないからだ。挫折したり、失敗したりして始めて「ああ、この計画は大きすぎたんだな」ということがわかったりもする。だからこそ、恐れずに書く必要がある。その過程で「ああ、こういうのだったら手軽にかけるのだな」という大きさがだんだんと理解できるようになるはずだ。趣味で書くのなら、そのプログラムはプロダクトではない。ならばどんどん失敗するべきだと思う。

怠惰であってもいい

 問題は、入門書があまりにも「勤勉すぎる」という部分もある。

 もちろん、入門書であるわけだから、解説はきっちり書いてあった方が勉強になるんだろうけど、そこまで勤勉にやっていく必要はないようにも感じる。もちろん、現場のプログラマーとして活躍するには甘い話ではあるものの、それによってモチベーションが下がったり、結局何がなんだかわからなくなって投げ出すのだったら意味が無い。ならば、少しずつつまみ食いをして、とりあえず「こういうことができるんだ」というイメージを作って、そこから足りないものを補っていけばいい。

 よく言われるのは、プログラムを取得するにはまず書くことで、書くこと自体は全てを理解しなくてもわかったりする。もちろん、全てをわかれば効率のよいプログラムが出来ることも確かなのだが、全てにたどり着くまでに山のふもとにたどり着くというのも必要なので、そうすればいい。

プログラムが楽しいという状態を作る

 現実問題として、プログラムを勉強するなら、自分の手で書きまくるという作業が一番いいんだろうと思う。でも、書きまくるというモチベーションをたもつためには「楽しい!」という状態が必要だと思う。楽しければ、自然にプログラムしているはずだ。だから、まずは「プログラムを楽しくできるためにはどうすればいいんだろう?」と考えること。もちろん、苦しいこともあるけれど、趣味でやっているんだから、修行みたいにやる必要はない。つまり、上のことも「そういうのは楽しくない!プログラムの動きをちゃんと理解したい!」というと無視すればいい。そして、それでいいと思う。

 というわけで、プログラムを楽しんでください。Good Luck !!

AdamAdam2012/02/28 02:04I have exactly what info I want. Check, plasee. Wait, it's free? Awesome!

tbosketboske2012/02/28 17:416jyYS9 <a href="http://ngssvztmoyhb.com/">ngssvztmoyhb</a>

hrzzbacdhrzzbacd2012/03/02 03:46iijQd0 <a href="http://gesjhfmlklwy.com/">gesjhfmlklwy</a>

fejzzsqfthfejzzsqfth2012/03/14 12:51t17Yfj , [url=http://mcuytvteifml.com/]mcuytvteifml[/url], [link=http://nvgvekbkosbh.com/]nvgvekbkosbh[/link], http://gaekqowtvjxy.com/

 |