uzullaがブログ

uzullaがブログです。

超初心者プログラミング入門は「何」をやるべきか、主にPHPの場合。 - Webアプリエンジニア養成読本 AdventCalendar2014 五日目

Webアプリエンジニア養成読本アドベントカレンダーです。


Webアプリエンジニア養成読本 Advent Calendar 2014 - Qiita

前置き

本稿はあくまで、何のプログラミング言語もわからない人に向けた文章です。

オチですが

特に最初はプログラミングが詳しい人に教わりつづけるのが一番速いです。
千のブクマ、100のウェブサイト、10冊の本よりも、詳しい人は答えをくれる。
なぜなら、本はあなたの状況を勘案してくれず、人はあなたの意図を想像してくれるからです。


しかしまあ、運良くそういった教えてくれる人が身の回りに居ないことがあります。というか、居れば悩む事はないでしょう。

そうなるとコミュニティに参加して質問するか、あるいはコミュニケーションハードルが高いなら、やはり独習する事になるんですが、まあ、割と大変だ。さっさと覚えたいなら、さっさと聞ける人を見つけましょう。

しかし、思い通りにならないのが世の常なので、そういうのが無理な人もいるでしょう、以下に続きます。

「プログラミング」という行為で勘違いされやすい事

突然の私の勝手な理論ですが、プログラミングには以下のような能力が必要です。

・最終的に何ができるか、細かく漏れ無く表現できる想像
・それを、プログラムで表現できる方法に落とし込める思考
・実際にそれを書き上げ、動かす知識

私の少ない、人に教えた経験上ですが、プログラミング未経験者の方が「これがプログラミングの勉強だろう」と思っているのは、三つ目の書き上げる能力のようです。

実際の所、「入門書」とかいわれる書籍等のほとんども、それらの学習の為にありますのでそう思うのはしかたない。

入門書の使い方

入門書をただ読んで覚えると、「ifの書き方はわかった、意味もわかる、しかし何ができるかがわからない」という結果になりがちです。とほうもない言語の仕様や関数名の前にただただ立ち尽くすしかない。よくある話です。

たとえ話になりますが、一度もプレーしている姿をみずに、ルールブックだけで球技を覚えるのは多分相当に困難です。(あるいは、相当にヘンテコなことになる)

入門書でルールとなる知識を「確実に暗記する」必要はあんまりなく、一通り流して「どういう流れでプログラミングという行為を行う」のか、そして「(入門書の範囲では)どんなことができそう」か、という事を把握できればよいと思います。
細かい部分を「暗記する」必要はあまりありません。本はいつでも読めますし、まちがえていたらPHPは大体の場合エラーを出します。

あなたはなにができるかわかっているか?

「入門書を終えた、ではモノをつくろう!」となるが一歩も進めないのは、途方が付かないからです。
(なにをつくるかきまらない…というのは(ある人にとっては)真剣に存在する問題ですが、ここではヨソにおきます)

書籍やネットなどでは、例えばメールフォームをどうつくるかは全部おしえてくれますが、「メールフォームではない、自分が欲しいある物を作る時、何をつくらないといけないか」、「そのときにはどのようなコードを書くべきか」は教えてくれません。ノットインタラクティブです。

繰り返しになりますが、こういう時に人に聞けば大体教えてもらえます*1

私も「○○をつくりたいのだが、どうすればいいのか?」という相談を受けることがあります。
話が変わるようですが、その時、「○○」がどれだけ想像できているかは重要です。

一般的な名詞では「仕様書」というものが一番近いかも知れません。ただ、貴方が仕様書を見た(あるいは書いた)事があっても同一視しないで下さい。実際多くの仕様書はプログラマにとって「これでは足りない」と言われるものです。(あなたは「ここにユーザーを引きつけてやまない最高のUIをそなえた機能がある!」とかかいてある仕様書をみたことがありますでしょうかね?)

ウェブサイトを普段からつかっているなら「大体どういうものかわかっている」つもりになっているかもしれません、しかし、多分わかっていません。

「普通に考えたらこうなるっしょ?」という気軽な理由で省略される幾千もの挙動を(無意識であったとしても)理解する必要があります。どういうこっちゃと思うかもしれませんが、

ツイッターみたいなサイトを作りたい
・入力欄には文字が入力できる
・ボタンを押すと投稿され、保存される
・一覧にはそれらが更新順で投稿される

…みたいな事を大量に考える事です。

「バカにするな」と思わないでください、たとえば上の例では、何も入力されずにボタンが押されたときが考慮されていません。そういうことをあなたは思いつけますか?(もし思いつくならば、すみませんでした、貴方はすでにこのエントリの想定読者ではありません!)

ある程度熟達すれば、このあたりは無意識にできるので、雑な仕様書でもかまわなくなりますが、ぱっと必要な様々な処理が想像できるようになるには、相当な時間がかかります。

このあたりは比較的スルーされがちですし、これを「教える」のはたいそう大変なので、「そのうちわかるよ」とされる事が多いとおもいます。

なぜなら「何かを定義する」というのは、既存の何かの組み合わせでしかないので、経験がふえれば加速度的に解決していくからです。そして、そこには「PHPで、貴方でもできるレベルのこと」でないといけません。

たとえば掲示板に「完全無欠なNGワード機能をいれたい」としたときどのように投稿がNGワードなのか判定する必要がありますが、それは実際にやってみると相当にむずかしい事だったりします。単語のリストをもっておいて、一つ一つチェックする?それはただしいやり方ですね、でも完全無欠は実現できなさそうです。できる範囲でガマンしなければなりません。


そう言う意味で「使える技」がないと、具体的になっていきません。また、「何を作るか」がはっきりしていないと、技をえらびようがありません。*2

よって、if文とかどうでもいいから、いきなり「ツイッターに投稿する」とか、そういう基礎を無視したような「使える技」のコードを(とりあえずは)ドンドン真似てかいていったほうが良いと私は思います。

(ちなみに、ここでいう技とは、数行〜数十行程度の定型的な、コピペができるようなコード片のことをいいます)

技のレパートリーを増やす

前述の通り、何かをつくるときには、自分ができる(あるいは、勉強すればできる)技の組み合わせで、自分の作りたいものの近似をさぐっていく必要があります。

繰り返しになりますが、大体の場合、人にきけば一発でどのような技が良いか教えてもらえますが、人に聞けない場合はどうすればよいか…。

まあ、「やっていけば、そのうちわかるよ」というのが回答になりますが、なにをやっていけばよいのでしょうか?

現実的な手法として、ネットで公開されているサンプルコードや逆引き本を頭から全部読んでみる、というのがあります。

(逆引き本の例)


逆引き本にはかなりの量の技が登録されており、たとえば単語とテキストを比較する技(NGワード判定につかえますね!)*3や、1ファイルに何千個も単語をいれておく技(NGワードを保存するのにつかえますね!)*4、メールを送信する技(NGワードが投稿されたときのアラートに使えますね!)などがのっています。

そう言う物をたくさんよむことで「なるほど、PHPでできることはこの程度か」と知る事ができますね。あとは、それらの技をコピペ(!)で組み合わせて自分が欲しい物と似た物がつくれないか考えていきましょう。

ただ、高度な技をつかうには、自分も高度なPHPレベルが必要です。単なるコピペで動かないコードもたくさんあります。


後、「なるほど、ググったらフレームワークをつかえば速やかにそういうものがつくれそうだ!」というのはおそらく初心者には辛い話です。
「良いWAF」は腕のあるPHPエンジニアが書いた、大量の最強技のコンボです。変な話ですが、良い、今ドキであるWAFほど、高いPHPレベルが要求されます。
理解ができなければ、WAFのサンプルにかいてあることそのまましかできないと思います。それでは自分が作りたいものをつくることはできないでしょう。
最初から最強技のコンボをつかうことを目標にはしないでください。逆にいえば、WAFが使いこなせるようならPHPレベルはもう一人前です。

どんな時に、どの技をつかうか学ぶ

技をある程度おぼえていっても、どうにも自分がやりたい事への近似がみつからないことがあります。解決方法は…そうですね!人に聞くのが一番(以下略

人に聞けない場合はどうすればいいか。人のコードを読んでみましょう。


たとえばあなたがメールフォームや掲示板をつくりたいなら、間違いなくオープンソースソースコードが公開されたプログラム)の物が見つかります。
ググってもみつかりますし、今ドキのものが知りたいなら、Githubなどで検索してもよいでしょう。

当然ながら、完成したアプリケーションには様々な技がコンボでつかわれており、最初は大量のコードに圧倒されるでしょう。入り組んだコードは、どこがどの技なのかを見つける事も困難だとおもいます。貴方のPHPレベルや、技のレパートリーがひろければ、ある程度拾い読みができるかもしれません。


まずは、小さく、古いアプリをまず見てみる事をおすすめします。そういったアプリは冗長であってもシンプルな技しかつかっていないことがあるので、比較的容易に読む事ができます。掲示板とか、メールフォームとか、カウンターとか、昔なつかしいものが一番です。

逆に最悪なのは、WordpressやECCUBEなど、超有名な巨大オープンソースソフトです。あれはハッキリいってPHPができる人でも読みたくない規模と難易度と(検閲削除)です。

そうですね、最初はファイル数が三つか四つくらい、1ファイルが1000行を超えないくらいのものがよいでしょう。*5
とはいえ、最初はそれを分析するのにも山のようなあたらしい技をおぼえないといけないでしょうが…。


兎に角、がんばれば様々な技をどのように組み合わせれば、どういうことになるのか。あるいはメールフォームなどをつくるには、どういった技をつかえないといけないのか、というのが判る様になってきます。

もしかすると、ここまでくればコピペを駆使し、何かを改造して自分のアプリをつくることができるようになるかもしれません。

技を分析する

ただ、なんとなくやりたい事ができるようになっても、どうにも自分が欲しいものに近づけきれないかも知れません。あるいは、ある技をつかいたいのにどうしてもある場所で使えない、コピペで動かない時がきます。
これでは、あなたが技に「つかわれて」います。

どうにもわからない技がでてきたら?そりゃー人に聞くのが一番(以下略

さて…、ここでやっとPHPについて本腰をいれて勉強するしかなくなります。技がどういうことをやっているのか、具体的に理解する必要があります。たとえば、5行くらいのコピペコードを完全に理解する必要があるわけです。

ここで再度入門書が登場したり、php.netや、パーフェクトPHPなどの細かい情報までが掲載された情報源にあたる必要があります。ここはちゃんと勉強すればするほど理解が進む所です。

変な話ですが、ここまではそこまで真面目にPHP言語を理解していなくてもなんとかなってきたでしょうが、そのツケを返すときです。あるいは真面目に基礎をやってきた人ならば、ここでついにその意義が発揮されることでしょう!

ここが超えられれば、コピペコーダー卒業でしょう。

ま(あ)と(にかく)め(んどうだ)

まとめになりますが、プログラミング自体が初めてだという方が独学でどうにかするなら、

目的の物に似たものをさがしてきて、
コピペして、
つかえなかったらPHPレベルが低いのだともっと単純なものを探して、
みつからなければその機能は諦めてのループをこなし、
どうしてもコピペでガマンならない所はがんばって勉強して理解してみる

というコピペコードの学習方法が一番良いです。


コードは無言の師匠みたいなものですので、それを見て真似て、その真似の中に理屈をみつけることができれば、習得ができたことになります。*6

注意すべきは、ロクでもない師匠がよのなかには山ほどいることであり(というか、ロクな師匠はほとんどいないという現実)それらはさっさと見切りを付ける必要があります。
が!最初はそういうことを見抜くことはできないでしょう、ロクな師匠を探す事にかまかけていたら、やはりなにも学べません。あきらめてろくでなし師匠をまねて、さっさとそこから卒業するようにしましょう。


ちなみに、ろくでなし師匠で一番まずいのはセキュリティの問題を作り込む事です…が、「これにはセキュリティの問題がある!」と言えるのは、当然師匠を超えた後になりますので…ジレンマですね…。

このあたりは色々な意見があるのですが*7、私としては先にすすめなければどうしようもないので、そこらへんはある程度割り切るしかない所です…。というと怒られるんですよね、困った。
ただ、良い書籍や情報は多いので、「可能なかぎり」ちゃんと勉強しましょう。

昔は、他人の個人情報や、決裁情報をあつかわないかぎりは、せいぜい自分がつくった掲示板が荒らされたり、ゲームのデータがぶっ壊されるとかだったのですが、今だとマルウェアとかはりつけてくる人もいますからね…牧歌的な時代に戻りたい所です…。


ま、話をもどしますが、兎に角、世の中にあるものは作る事が(多分)できるので、そう言う意味でも最初は世の中を参考にするのが一番なんです。

しかし、前述した通り、わりと世の中のコードは高度にできていて*8、初心者が完全に把握して、構造を分解して理解することは困難です。そこらへんはわきまえないといけない。ぐっとガマンして、面白くもないようなシンプルなものから始めましょう。

千里の道も一歩から、簡単なものから(前回の記事にかいたような、サイコロプログラムがどういう意味なのをしらべるようにして)実際に書きながら、足りない所をおぎないつつ頑張りましょう。


そして早晩、ifまではわかっても、for文や、配列がよくわかんね!!WAFってなに!?DBっておいしいの!?となるとおもいます。

にっちもさっちもいかなければ、有料のスクールなどもありますし、勉強会とか*9で検索して、がんばって参加するのもよいでしょう。言語は違いますが、Perl入学式みたいなものもあります。

プログラミング言語が違っても、関数型言語とかでないかぎり大体理解は転用できますし、そもそもPHPじゃなくたっていいじゃないですかね!
PerlでもRubyでもJavaでもC#でも、覚えられる言語をおぼえて、いつか帰ってくればいいんです!(とはいえ、PHPに戻ってくる人は少ないですが…)


みなさんがんばりましょう!

最後に、しなければならない宣伝

さて、宣伝タイムです。帰らないで下さい。

まず再度の書籍の宣伝です、本アドベントカレンダータイトルの書籍です。

このエントリが役立つ方には、まだちんぷんかんぷんかもしれません。即座に買えとはいいませんが、いつかは買って欲しいです。まあ、本屋にいって他の書籍のついでに立ち読みしてみるのも良いでしょう、買って欲しいですが。

もし、この書籍の内容が理解できれば、おそらく仕事でもなんとかやっていけるレベルにいるのではないでしょうか。そのようなベンチマークとしても役立つと考えております。つまりは買っていただきたい!ということです。

しなければならない宣伝2

来年の夏に開催されるYAPC::Asia Tokyo 2015についてです。


YAPC::Asia Tokyo 2015

YAPC::Asia Tokyoは世界最大級のエンジニアの手による草の根技術カンファレンスです。これまで9回開催され、様々な技術に関する発表そして技術者同士の出会いを生んできました。

「なんかエンジニアコミュニティってきいたことがあるけど…」「カンファレンスってどんなの?いったことない」という人でもきっと新しい発見があるイベントとなりますので是非ともチェックしてください。

f:id:uzulla:20141201013416p:plain

YAPCPerlのカンファレンスと思われがちですが(実際そうなのですが)、どんな言語の人でも、きっとPHPの人でも楽しめるイベントになっております。なにせ去年のベストトーク賞はPHPトークでした*10


来年は10年目かつ、今の運営における最後の開催となり、規模も、話題のバリエーションも間違いなくパワーアップしますので、是非来年のスケジュールにいれておいてはいかがでしょうか?

f:id:uzulla:20141201013436p:plain


…といっても、来年の話では忘れてしまうでしょう。近日中にお知らせをとどけるメールマガジン的なものができるはずです(鋭意作成中)

本日の所は、まずは公式Twitterアカウントのフォローなどをされてはいかがでしょうか?


といった宣伝をおこなった所で、こちらからは以上です。また次回お会いしましょう!

次回はすがまさおさんで、タイトルはまだ未定みたいです!!!

(ちなみに、読者の方も参加されるとのことで、大変たすかりますね!!)

*1:勿論、途方もないものを作ろうとしているなら回答が得られない事もあるでしょうが

*2:これは私が思うに鶏と卵的な問題です

*3:たとえば正規表現

*4:たとえば、DBやCSVに単語を登録する方法

*5:あくまでPHPの場合です、HTMLが入ってる事が多いので…

*6:まあ人に聞けば一発ですが

*7:セキュリティが完璧でないなら、プログラムを公開すべきではない!という原理主義と、がんばれる範囲で諦めようゆるふわ〜の日和見主義。いずれにせよ、セキュリティが重要なことにはかわりがないのだが…

*8:ダジャレではありません

*9:あるいは、私がいるようなHachioji.pmとか

*10:というか私です