uzullaがブログ

uzullaがブログです。

コミュニティに参加してつまづき最小限、学び最大限に - Webアプリエンジニア養成読本 AdventCalendar2014 14日目

昨日オールナイトの忘年会で完全に眠いuzullaです。

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


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

その書籍の作者4人が仲良くなったのも、この忘年会でした。
https://atnd.org/events/58716
https://atnd.org/events/58716

これもコミュニティの一つであり、人と人とのつながりというものは楽しく、有意義ですね。

もう8年目なのですが、これがおわると年末だ!という気分になります。
来年も是非参加したいですね。

まずはDISCLAIMER

あくまで、これは個人的な視点で、個人的な趣向です。これが性に合わない人も絶対にたくさんいるでしょう。
「これにならって、よくわからん奴がふえるのは迷惑だ」と感じる人もいるでしょう。

先に言っておきます、すみません。*1

後、自分はあらゆるコミュニティを知っているわけではないし(むしろ、狭い)、特定の何かを代弁したいわけではないです。しかしまあ、言語がたくさんあるように、人がプログラミング言語に向かい合う姿勢もいろいろあるので、こういうのもあるんだな、と思っていただければ幸いです。

あと、「こういうのは馴れ合いだ」とか、あるいはもっと厳しい意見も全く納得できます。
ただ、私にとっては、それが客観的に馴れ合いに見えるとしても、本人にとっては前に進む動力になっているのも確かです。

あと、これは必須なことではありません。会社に所属していれば、会社自体がコミュニティの場合も多くありますし、そもそも独習ができないということはないのです。
ただ、楽しいですし、はかどるのでどうでしょうか?という所です。

さて

先日のアドベントカレンダーの記事において、「人に聞け」という話をたくさんしました。

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


じゃあ何処で聞くのか?という話をします。

オチとしては、大抵の言語にはコミュニティというものがあり、そこに参加して、知り合いを作るとプログラミングの学習がはかどる、という話です。

コミュニティとは?

その言語をつかっている人達の横のつながりです。

特にウェブ系では、ライバル会社であったとしても、それをまたいで様々な「同じ技術を使っている人」が知り合い、情報をシェアしあっていたりします。

そして、コミュニティの人達がそれぞれで勉強会(どこかの会場であつまって、発表や情報交換を行う)や、カンファレンスを開催する事もよくあります。ボランティアベースが多いですが、場合によっては(特に商用製品の場合)企業が主催や協賛をしていることもあります。

そのような場で人と人とのつながりが新しくつくられたり、新しく人がはいってきたりして、コミュニティはつづいていきます。

つまり、コミュニティに自分も参加すれば、その技術をつかっている人とつながることができ、様々な情報交換をする事ができるようになるでしょう。

あらためて、聞ける人の大切さ

まず、勘違いをしてほしくないのですが、ここでいう「聞ける人」はあなたの教師ではありません。0から全部を教えて貰う為に知り合う、というのはかなりお門違いです。

まあ、Perl入学式みたいな「0から教える」系のコミュニティはあるのですが、一般的ではありません。


Perl入学式 プログラミング初心者のためのPerl入門講座



プログラミングは人によっては独習が難しいものです。このあたりは前の記事に記載しているので端折りますが、学習者は様々なちょっとした悩みをもちます。わかってしまえば忘れるような簡単な段差を超えられない事があります。本などではちょっと図がたりてなかったりとか、たとえがわかりづらかったりとか、ウッカリ間違った理解ですすんできて、それと食い違ってしまったりとか、そういうのですね。

実際に聞かれた事ですが、たとえばfor文は以下のようなものですが、$i、というのがよくわからないといわれました。

for($i=0;$i>10;$i++){
    echo $i;
}

どこの本にも$iとかいてあるので、これは$iでないといけないと勘違いする人とかいます。それだと当然forの入れ子*2がバグります。

こんなのは、プログラミングやっている人には当然ですが、$iは変数なので$xでも$indexでも$countでもよい。一言で終了です。

ただし、これは割とググラビリティが悪い問題だったりします。*3
場合によっては、それをしばらく信じ込んでしまい、「もの凄くひねった解決策を書いてしまう」ことがあったりします。

こういう本当にしょうもない(まあ本人にとってはヒッジョウに重要なことですが)事は人に聞くと一発で解決します。
人間は、ありとあらゆる検索エンジンよりも推論ができる分こういう事は得意だったりするのです。

情報の答え合わせ

さて、そこからある程度学習できて、forやifや配列で困る事がなくなるかもしれません。では、もう人に聞く様な事はないのでしょうか?そんなことはなかったりします。

たとえば、何かしらコードを書けるようになったある日、「メールを送信するにはどうすればよいか?」とふと思います。ある程度本がよめて、ググったりできれば、解決策をみつけるかもしれません。
しかし、ここに罠の可能性があります。

「メールを送信する」方法は非常にたくさんあります。仮にPHPならsendmailをopen、mail関数、mb_mail関数、PEAR::Mail、SwiftMailer、qdmail。私が比較的多く触った物だけでもこれくらいあります、もっともっともっとあります。

さあ、あなたはどれを使うべきなのか、どれが正しい(ベター)なのか?

「古いのはダメ、必ず新しければ良い」なんてことはありません、新しい方法は下位互換性がなかったり、不安定だったりします。単に昔からある手法だからとあまり話題にならないこともあります。そもそも、日付が先週のブログ記事だったりも、10年前の情報の再掲載の場合すらあります。

そういう時に、人にどうしたらいいのか?と聞けば、例えば

私は今はSwiftmailerを使う事が多いですね。
ちょっと前までは、古いメーラーの相手を考えると(特にガラケー)qdmailが鉄板でした。ただまあqmail対応の条件分岐コードがちょっと邪魔なのと(ログが…)、composerに対応してない(有志の人がもってきたものはありますが)のも不満なので。

…みたいな回答が得られ(るかもしれ)?ま(す|せん)。すごい、解決だ!(雑)。

勿論、その人が最高の回答をくれているとはかぎりません。その人が悪いとかではなく、趣味の問題もあるので。

しかし、悪手な回答(mail関数+自力エンコードの秘伝のタレ*4とか)はあまりでてこない(と思いたい)ので、ググって古代の情報をしらべるよりも良いだろう、というのが私の考えです。

あとまあ、セコい考え方ですが、その人はその解決策をやったことがあるわけで、またその先で詰まったら聞きやすいと言うこともあります。

モチベーション維持

基本的に学習のモチベーションを維持することは結構大変です。プログラミング自体は(好きな人には)楽しい物ですが、まあそうはいっても2〜3日でおぼえられるようなものではないので、多くの人はやる気の枯渇に早晩直面します。

そこで、モチベーション維持の方法は色々ありますが、一つ非常にモチベーションを維持しやすい方法として人に見せる、という物があります。「こんなのつくったよ!」と出し合うのは良いですね。

あるいは、前述の「こういうので悩んでいるんだ!」で回答をもらえれば、教えて貰ったからにはやらねばならぬ、という圧力にもなったりする。


また、すこし難易度は上がりますが、勉強会などで「発表」するのは非常に強いモチベーション維持につながったりします。やったことがない人にはピンとこないかもしれないが、発表をすることで

・発表に耐える「成果」をつくらないといけないという圧力
・懇親会などで発表内容*5に詳しい人とつながれたりする
・うまくいけば、承認が得られる

からです。

まあ、このあたりつっつくと変な揶揄に聞こえるのでなにがどうだと書くつもりはありませんが、様々な勉強会において、自分の身の丈にあった(あるいは多少背伸びをした)発表をするというのは、モチベーション維持に効果があるのでお勧めできます。


ただ、「ハヤリ」を追いかけると発表がしやすくなりますが、ハヤリのものは実際に使い物になるか?という所もあるし、「発表は楽しいので」、発表だけを目的としてあれこれを頑張りすぎてしまうのは(プログラミング学習のコンテキストにおいては)良くないと私は思います。

ただまぁ、単なる趣味ならそれでいいじゃんとも思います。たとえば私の昨日のエントリ(PHPでアプリたい)はまったく実用性が今ないですが、ああいったものは「遊びである」と理解した上で、ハヤリとか、ちょっと話題になったものとか、オモシロネタとかをやるのは良いでしょう(ちなみに、Hachioji.pmのLTの焼き直しである)。
おもしろネタは知り合いを増やすのにすごく役立ったりするので「理解し、空気を読みながらやる」分にはお勧めできます。

イムリー情報の入手

プログラミングの手法や定石は、どんどん変わっていきます。たとえばライブラリのバージョンがあがるだけでなく、もっと良い何かが突然登場することもしばしばあります。あとは、良いツール(エディタとか)や、良い書籍を紹介してもらえる事も勿論あるでしょう。
こういった情報は本になるまでに時間がかかることも多く、ネットや雑誌などで追いかけるしかありませんが、やっぱり一人では限界があります。

そういう時に、やはりコミュニティなどに所属しておくと、とても詳しかったり、アンテナの高い人が頻繁にシェアしてくれたりすることが多くあります。

勿論既存の手法が全部悪い、という事は全く無いのですが、やはり新しい手法の存在位は軽く把握しておきたいですし、もし会話や発表で概要などが話されれば、ちょっと手間が省けるかも!という、手抜きも狙う事ができますね。

本などの情報の入手

変な話ですが、独習するのに一番良い本を選ぶのも、結局人に聞くのが一番だったりします。
完全な初心者向けの入門書はあまり詳しい人は居ないと私はおもっていますが、ちょっとした中級者からの本であれば、ネットや本屋で立ち読みするよりも、詳しい人に良い本はないか?と聞いた方が間違いがありません。

ネットなどで「この本お勧め!」みたいなブログが結構あるのですが、「なんでお勧めなんですか?」と聞けないとやっぱり自分には合わない事があったりするからです。(まあ、このエントリも本の宣伝なわけですが(以下略))


さて…

ということで、コミュニティなどに顔をだし、他のエンジニアとつながりがあれば、どのようなメリットがあるかを簡単にお話しました。

基本的に、エンジニアの知り合いとの会話はたのしいので、あまり細かい事を考えずに友人や知人をつくりにいく、くらいのノリで始めるといいのではないでしょうか。

…で、一体どうすればコミュニティに参加できるのでしょうか?


そういったコミュニティは前述もしましたが、勉強会を定期的に開いていることが多いです。

どのような勉強会があるかは有名な情報源としては、IT勉強会カレンダーでしょうか。

IT 勉強会カレンダー


毎日都市部ではなにかしらの勉強会がひらかれている事がわかるかなと思います。
このカレンダーは勿論全部を網羅できているわけではないので、自分でググってみるのもよいでしょう。

他にも

TECH PLAY[テックプレイ] - IT勉強会・セミナーなどのイベント情報検索サービス

などといったイベント情報検索サービスもあります。


ただ…、しらべるとわかりますが、コミュニティに参加するのは圧倒的に東京近郊に有利さがあります。
もし都心でないなら、気長に探すか、待ちましょう。あとは、遠征という手もありますね。

今回はあまり紹介しませんが、ネット上にもコミュニティはないわけではありません。*6
ブログなどで自分から発信したりすれば、あるいは回答がもらえる事もあります。

ただ、相当に非効率的なので(ネットで知り合いや友達を作るのが得意な人ならよいですが)、さっさと対面のオフラインでつながりをつくったほうが良いでしょう。

どの勉強会に行くか

当然自分が勉強している言語の勉強会に行くべきですが、みつからないなら

・ある程度近い言語ならとりあえず行ってみる
ミドルウェアの勉強会にいってみる(DBや、Httpdなど)
・勉強する言語を変える(!)

がお勧めできます。

後、PHPそのものではないけどPHPでできたWordpress等のPHPに縁がある勉強会も開催されていると思います。
そこでPHPの質問をいきなりするのは空気を読んでいませんが、そこに居る人は結局PHPをやられている人が多いので、「自分が興味のあるソフトの勉強会」であれば、「ついで」という形で行ってみるとよいのではないでしょうか。


また、勉強会などに初めて行くのは怖い…という方もいるかもしれませんが、大体の勉強会は初心者を拒んだりはしません。強いて言って、人数が多い勉強会の方がまぎれるので、あなたの気分は楽かもしれません。

ただ、実際に人とつながるのに一番重要なのは懇親会です。多くの勉強会では懇親会とよばれる(無い勉強会も勿論あります)、発表者、聴講者がまざって様々なコミュニケーションを取る場があります。

ここで実際に話し掛けてつながりをつくっていくしかないのですが、まあ、やっぱり難しいかもしれません。このあたりも良い感じのやり方を言えればよいのですが、なかなか難しいですね…。

一つ、コツというか変な話ですが、いわゆる「発表している人」ほど、つながりをつくりやすかったりします。
Twitterで事前にフォローしてリプライをおくってみたり…ブログで引用してみたり…どうだろう、なんかここ難しいですね…。色々な手法はありますが、まずは相手を先に知っておき、その人がおこなった発表について質問とかしてみれば会話の糸口になりやすいのではないでしょうか(なんだこのアドバイスはw)。

数人くらい親しい知り合いができると、あとは比較的簡単に、慣れるというのもありますが、紹介が紹介を生む状態になって加速度的に解決します。


後、実は人数が多い勉強会ほど「ぼっち」になりやすく、知り合いをつくることは困難だったりします。
ある程度人数がすくない勉強会に行ってみるのもよいのではないでしょうか。たとえばHachioji.pmなんかはPerlの看板がかかってはいますが、10〜20人程度の少人数で、PHPやJS、Javaなどの話題もでてきます。そもそも主催がPHPerです(私だ)。

勉強会以外にも、たとえばもくもく会*7ハッカソン*8などが開催されていることもあります。こちらも是非しらべてみましょう。

忘れないで欲しい事

多くの勉強会にいけばいくほど、学びがあるわけではありません。実際のところ、自習と両輪になります。
特に最初のうちは勉強会にいくと達成感みたいなものがあるかもしれませんが、それは完全に錯覚です。

自分一人でウンウンうなることも非常に重要ですし、そこのブレイクスルーとしてコミュニティのみなさんの力を借りるのが良いでしょう。そもそも自分で悩まなければ、何を聞いて良いのかすらわからないと思います。


また、自分が成長したら、コミュニティに恩返ししてみましょう。コミュニティを盛り上げるというと大げさですが、なにか成果物を作成して還元したり、ブログなどで知見を共有したり、昔の自分のような人がいたら手をさしのべたりなど、様々な方法があります。
決して、無理にやることではないですが、コミュニティはギブアンドギブの精神が重要かな、と私は思います。


あと…コミュニティの一部の人や内容と「ソリが合わない」こともあるでしょう。いきなり苦言を呈したりせず、変なアクションをしない方が得策です。多少勉強会をずらすこともできるとおもいます*9

一度いってみて、うまくコミュニケーションがとれないこともあるでしょう。でも一度でめげないようにしましょう。他の所にいったり、日を改めて行ったら印象が変わる事もあります。

コミュニティには様々な人がいますし、関わり方も色々ありますので、一度の印象で「コミュニティなんて二度と参加しない!」とか思わない方が良いと私は思います。


他に、これも極端な話なのですが、凄く高度な場所においては、あまり初心者にかまってられない、という所もあります。
特に、流行の先端は、エッジな人(つまり、スゴイ人)が多かったりするので、そういう人は勿論スゴイ人と研鑽することに注力している事が多くあります。

あくまでもコミュニティはボランティアでシェアがおこなわれており、何度もいいますが、あなたの先生がいるわけではありません。
そう言う場合も別の勉強会に行ったりとか、あるいは自分の方を(たとえば、学ぶ言語を)かえてみましょう。


あ、後最後にもう一つ、コミュニティに参加していないスゴイエンジニアはたくさんいます。
コミュニティでスゴイからといってスゴイ、というわけではないのです。
勿論、コミュニティに参加しないからダメだ!ということもないのです。
*10

コミュニティ賛美や至上主義(?)みたいなものがマレにありますが(このエントリも、わりと賛美よりに見えますが)、こういうのは、好きなが「楽しいぜ!」といってやるものであって、比較したり優劣をつけるものではありませんし、楽しめない人はおかしい、というのはおかしい話なのです。

昨今はコミュニティが非常に活発な領域もあるのですが、このあたりのことはゆめゆめ忘れないようにしましょう。

さて、結局三日三晩でできるものではない

本をつかうにせよ、コミュニティに参加するにせよ、三日三晩でなにかが大きく変わることはありません。
千里の道も一歩から、自分のペースで進めましょう。

ただ、一歩はいずれにせよ一歩ですので、色々な方法で歩みを進めて、停滞することなく継続して学習していっていただければいいなあ、と私は思っております。

よろしければ、みなさんのコミュニティへの参加や貢献をお待ちしております。


こちらからは以上…ではありません。

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

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

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

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

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

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

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


YAPC::Asia Tokyo 2015

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

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

f:id:uzulla:20141201013416p:plain

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


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

f:id:uzulla:20141201013436p:plain


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

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


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

*1:まあ、このブログ程度の影響力でどうこうないでしょうが

*2:forの中にforを作る事

*3:ちょっと前までは、Googleは記号の検索が非常にヘタだったし

*4:誰かが考えて、長く使われている、動くには動くんだけど、どうなってるのかよくわからないか、今どきこれはどうか?と言われやすい作りになっているライブラリや、お作法

*5:つまりは、自分が興味があることだ

*6:昔は某大手掲示板とかも活発でしたが、特にPHPなどのウェブ系においては、あまり掲示板等は活発ではないですね

*7:あつまって、もくもくと自分の作業をやる

*8:短時間で、なにか成果物を完成させる。ハッキング+マラソン

*9:深い意味や、特定のだれかをさしているわけではないですが、たとえば懇親会メインの所はちょっと…という人もいるでしょう、たとえばそういうことです

*10:あと、コミュニティには属していて、発表は特にしないけどスゴイ人もいます、まあ色々スゴイ人はいるのです!!

*11:というか私です

PHPだってアプリたい! - Webアプリエンジニア養成読本 AdventCalendar2014 12日目

サワディカープ、タイから帰国して数時間のuzullaです。12月だというのにめっちゃ日焼けしました。

「帰国日の今日が俺の担当だ!!ヤバイ!できてない!!」って感じで1時間くらいで一気にかいてるので、週開けにも直したいとおもいます…。


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


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

PHPって…

基本ウェブアプリにしかつかえない。CLIのアプリも書けるけど、書いてる人すくない。
「でもやっぱりプログラミングやるなら、アイコンダブルクリックしたら起動するアプリやりたいよね…」

ワカリマス

nightrain

nightrainをつかってみましょう。

HugeDomains.com
https://github.com/naetech/nightrain

これをつかうと、GUIのアプリをPHPで書く事ができます!!!

「これは一体なんなの?」

オチから言えば、ウェブアプリをパッケージするためのツールです。

PHPとJSとHTMLでネイティブ(?)アプリを作成できる
Mac、Win、Linux対応
・基本的に、PHPでできることはできる*1
・当然ローカルファイルも読める
SQLiteとかつかえば同梱でDBも用意できる、勿論Mysqlだって使える

似ているものとして、PhoneGapとかああいうのを想像してもらえればよいかなと思います。

例、Tinitterをパッケージしてみる

ウェブアプリエンジニア養成読本のPHP編では、Tinitterというサンプルアプリを作成します。コードは以下で公開されています。
GitHub - uzulla/Tinitter: (Abandon) PHP sample web application


f:id:uzulla:20141212234231p:plain

これを、NightrainでOSXのapp化してみました、以下からどうぞ。

http://bit.ly/tinitter-app

サンプルアプリなので、内容的にはしょうもないものであり、どうこうはありませんが。

イジり方(OSXの場合)

配布されているnightrainのファイルや、上のtinitterのサンプルappをDLして、右クリックして「パッケージの内容を表示」とすると、中のファイルを見ることができます。

そこから(デフォルトでは) アプリ名.app/Contents/MacOS/www といったディレクトリをひらき、その中に、まるでウェブサイトをつくるようにファイルを作成・配置・修正していくと、そのまま反映されていきます。

上のTinitterアプリの場合は、DocumentRootより上にライブラリを置きたかったので、settings.iniを修正し、ディレクトリ配置を少しだけかえています。

ファイル修正後、特にコンパイルは必要ありません。

細かい話

現在のNightrainは、要はOSXに最初からはいっているPHPをビルトインサーバーとして起動して、同時にそのURLを簡易なウェブブラウザで表示する、ということをやっています。

なので、アプリ起動中にhttp://localhost:8000(デフォルトの場合)にブラウザでアクセスすることで、普段のブラウザでも見る事ができます。

というか、開発時はそっちでやったほうがリロードとかが楽です。

わりと制限がないので、gitレポを同梱しちゃう!みたいなのもまあできますね、そうしたらgit pullでバージョンアップできる!!!かっこいい!!!(大分頭おかしい)

これって「PHPで作れる」っていえるの?

実際のところ、アプリっぽくしていくには、相応にHTMLとJSの腕も必要になるので、PHPだけでできるって感じではありませんね

ただ、PHPをやっていたら、当然ウェブアプリをつくるでしょうから、その腕をそのままもってこれるので、非常に学習コストが低いですね。

PHPはウェブアプリしかつくれないからつまんない!というご意見について、色々涙ぐましい努力によって多少魅力的になってくればいいですね!!
(まあこれもウェブアプリっちゃウェブアプリなんですけど)

で、使いものになるの?

オチからいえば、まだバグが多い。

なんというか、しょうもないバグが多い、アプリ終了してもビルトインサーバが終了しないとか、そういうやつです。
そういう細かいしょうもないバグがつぶれれば、こういうのはこういうので面白いかなっておもってます。

あと、欠点として、上のTinitterみたいにDBをSqliteにして、appの中に同梱してしまうと、バージョンアップでDBが消滅します。

~/Libraryとかに適切に作成していくとか、多少そういった、OSX向けの流儀は必要になるのではないですかね。

ちなみに

中身はPythonだそうです、ウケる。


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

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

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

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

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

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

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


YAPC::Asia Tokyo 2015

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

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

f:id:uzulla:20141201013416p:plain

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


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

f:id:uzulla:20141201013436p:plain


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

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


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

次回はrrreeeyyyさんで、タイトルは「IT インフラエンジニアに Web アプリエンジニア養成読本をオススメする n 個の理由 (n は書いたあとに決定されます)」とのことです!!!

*1:PHPビルトインサーバでできることなら

*2:というか私です

超初心者プログラミング入門は「何」をやるべきか、主に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:というか私です